1. Обзор
В этом руководстве мы узнаем, как мы можем взаимодействовать с компилятором Java через интерфейс командной строки.
В качестве предварительного условия нам необходимо загрузить Java и настроить переменную среды JAVA_HOME на нашем компьютере.
2. Компиляция одного файла исходного кода Java
Java предоставляет простой инструмент — javac
для компиляции файлов исходного кода Java. Начнем с компиляции небольшого класса Car.java
:
public class Car {
private String make;
private String model;
// standard setters and getters
}
Мы можем скомпилировать это из одной команды в каталоге, где находится этот файл:
javac Car.java
Если все работает без ошибок, вывода не будет. Компилятор создаст Car.class,
содержащий байт-код, в текущем рабочем каталоге.
3. Компиляция нескольких файлов исходного кода
Обычно наши программы используют более одного файла класса. Давайте теперь посмотрим, как мы можем скомпилировать простую программу с несколькими классами.
Во-первых, добавим два новых типа: Owner.java
и History.java
:
public class Car {
private String make;
private String model;
private Owner owner;
private History history;
}
public class Owner {
private String name;
}
public class History {
private String details;
}
Теперь нам нужно запустить следующую команду для компиляции:
javac Owner.java Car.java History.java
Следует отметить, что, поскольку классы, используемые классом Car
, находятся в одном каталоге, на самом деле указывать их не обязательно. Мы все еще можем просто скомпилировать Car.java
.
4. Основные параметры компилятора Java
До сих пор мы просто использовали команду javac без каких-либо дополнительных параметров, просто передавая имена наших классов в качестве параметров. Тем не менее, мы также можем настроить его. Мы можем указать компилятору Java, где найти классы наших библиотек, базовый путь, где находится наш код, и где сгенерировать конечный результат.
Давайте подробнее рассмотрим некоторые из этих вариантов.
-cp
или-classpath
-исходный путь
-d
(каталог)
4.1. Что такое параметр -cp
или -classpath
?
Используя путь к классам, мы можем определить набор каталогов или файлов, таких как *.jar
, *.zip
, от которых зависит наш исходный код во время компиляции. В качестве альтернативы мы можем установить переменную среды CLASSPATH .
Следует отметить, что параметр classpath имеет более высокий приоритет, чем переменная окружения .
Если ни один из них не указан, предполагается, что путь к классам является текущим каталогом. Когда мы хотим указать несколько каталогов, разделителем путей является ' :
' для большинства операционных систем, кроме Windows, где он ' ;
'.
4.2. Что такое параметр -sourcepath
?
Эта опция позволяет указать верхний каталог, в котором находится весь наш исходный код, требующий компиляции.
Если не указано, путь к классам сканируется на наличие источников.
4.3. Что такое опция -d ?
Мы используем эту опцию, когда хотим иметь все скомпилированные результаты в одном месте, отдельно от исходного кода. Мы должны иметь в виду, что путь, который мы хотим указать, должен существовать заранее .
Во время компиляции этот путь используется как корневой каталог, а вложенные папки создаются автоматически в соответствии со структурой пакета классов. Если этот параметр не указан, каждый отдельный файл *.class
записывается рядом с соответствующим файлом исходного кода *.java
.
5. Компиляция с внешней библиотекой
Помимо классов, которые мы создаем, нам также необходимо использовать внешние библиотеки в наших программах. Теперь рассмотрим более сложный пример:
библиотеки/ ├─ гуава-31.1-jre.jar модель/ ├─ Car.java ├─ История.java ├─ Владелец.java оказание услуг/ ├─ CarService.java цель/
Здесь мы организовали наши классы в пакеты. Кроме того, мы представили каталоги target
и libs
для размещения скомпилированных результатов и библиотек соответственно.
Допустим, мы хотим использовать класс ImmutableSet
, предоставляемый библиотекой Guava . Скачиваем и помещаем в папку libs .
Затем в пакете службы
мы вводим новый класс, который использует внешнюю библиотеку в CarService.java
:
package service;
import model.Car;
import java.util.Set;
import com.google.common.collect.ImmutableSet;
public class CarService {
public Set<Car> getCars() {
Car car1 = new Car();
Car car2 = new Car();
ImmutableSet<Car> cars = ImmutableSet.<Car>builder()
.add(car1)
.add(car2)
.build();
return cars;
}
}
Теперь пришло время скомпилировать наш проект:
javac -classpath libs/*:. -d target -sourcepath . service/CarService.java model/*.java
Мы включили папку libs в наш путь к классам с помощью
-cp
.
библиотеки/ ├─ гуава-31.1-jre.jar модель/ ├─ Car.java ├─ История.java ├─ Владелец.java оказание услуг/ ├─ CarService.java цель/ ├─ модель/ │ ├─ Автомобиль.класс │ ├─ History.class │ ├─ Владелец.класс ├─ обслуживание/ │ ├─ CarService.класс
Как мы видим, javac
успешно разрешил внешний класс ImmutbleSet
и поместил скомпилированные классы в целевую
папку.
6. Заключение
В этой статье мы узнали, как можно скомпилировать несколько файлов исходного кода, даже если у нас есть зависимости от внешних библиотек.
Кроме того, мы кратко рассмотрели некоторые важные параметры, которыми мы можем воспользоваться во время сложных задач компиляции.