Компиляция файлов Java *.class с помощью javac
В этом руководстве будет представлен инструмент javac и описано, как использовать его для компиляции исходных файлов Java в файлы классов.
Мы начнем с краткого описания команды javac , а затем более подробно рассмотрим этот инструмент, рассмотрев его различные параметры.
2. Команда javac
Мы можем указать параметры и исходные файлы при выполнении инструмента javac :
javac [options] [source-files]
Где [options] обозначает параметры, управляющие работой инструмента, а [source-files] указывает один или несколько исходных файлов, которые необходимо скомпилировать.
Все опции действительно необязательны. Исходные файлы могут быть напрямую указаны в качестве аргументов для команды javac или сохранены в файле аргументов, на который ссылаются, как описано ниже. Обратите внимание, что исходные файлы должны располагаться в иерархии каталогов, соответствующей полным именам содержащихся в них типов .
Опции javac делятся на три группы: стандартные, кросс-компиляция и дополнительные. В этой статье мы сосредоточимся на стандартных и дополнительных опциях.
Параметры кросс-компиляции используются для менее распространенного случая компиляции определений типов для реализации JVM, отличной от среды компилятора, и не будут рассматриваться.
3. Определение типа
Давайте начнем с представления класса, который мы собираемся использовать для демонстрации параметров javac :
public class Data ListString> textList = new ArrayList(); public void addText(String text) textList.add(text); > public List getTextList() return this.textList; > >
Исходный код размещен в файле com/foreach/javac/Data.java .
Обратите внимание, что в этой статье мы используем разделители файлов *nix; на машинах Windows мы должны использовать обратную косую черту (‘ \’ ) вместо прямой косой черты (‘ /’ ).
4. Стандартные варианты
Одной из наиболее часто используемых стандартных опций команды javac является -d , указывающая каталог назначения для сгенерированных файлов классов . Если тип не является частью пакета по умолчанию, создается структура каталогов, отражающая имя пакета, чтобы сохранить файл класса этого типа.
Давайте выполним следующую команду в каталоге, содержащем структуру, представленную в предыдущем разделе:
javac -d javac-target com/foreach/javac/Data.java
Компилятор javac создаст файл класса javac-target/com/foreach/javac/Data.class . Обратите внимание, что в некоторых системах javac не создает автоматически целевой каталог, которым в данном случае является javac-target . Поэтому нам может потребоваться сделать это вручную.
Вот еще несколько часто используемых опций:
- -cp (или -classpath , –class -path ) — указывает, где можно найти типы, необходимые для компиляции наших исходных файлов. Если этот параметр отсутствует и переменная среды CLASSPATH не задана, вместо нее используется текущий рабочий каталог (как в примере выше).
- -p (или —module-path ) – указывает расположение необходимых модулей приложения. Эта опция применима только к Java 9 и более поздним версиям — пожалуйста, обратитесь к этому руководству за руководством по модульной системе Java 9.
Если мы хотим знать, что происходит в процессе компиляции, например, какие классы загружаются, а какие компилируются, мы можем применить опцию -verbose .
Последним стандартным вариантом, который мы рассмотрим, является файл аргументов. Вместо того, чтобы передавать аргументы непосредственно инструменту javac , мы можем хранить их в файлах аргументов . Имена этих файлов с префиксом ‘@ ‘ затем используются в качестве аргументов команды.
Когда команда javac встречает аргумент, начинающийся с ‘@ ‘ , она интерпретирует следующие символы как путь к файлу и расширяет содержимое файла в список аргументов. Пробелы и символы новой строки могут использоваться для разделения аргументов, включенных в такой файл аргументов.
Предположим, у нас есть два файла с именами options и types в каталоге javac-args со следующим содержимым: