Автор оригинала: Nguyen Nam Thai.
1. Обзор
В этом руководстве будет представлен инструмент javac и описано, как использовать его для компиляции исходных файлов Java в файлы классов.
Мы начнем с краткого описания команды javac , а затем рассмотрим инструмент более подробно, рассмотрев его различные варианты.
2. Команда javac
Мы можем указать параметры и исходные файлы при выполнении инструмента javac :
javac [options] [source-files]
Где [параметры] обозначает параметры, управляющие операциями инструмента, и [исходные файлы] указывает один или несколько исходных файлов, которые будут скомпилированы.
Все варианты действительно совершенно необязательны. Исходные файлы могут быть непосредственно указаны в качестве аргументов команды javac или сохранены в файле аргументов, на который ссылается ссылка, как описано ниже. Обратите внимание, что исходные файлы должны быть расположены в иерархии каталогов, соответствующей полным именам типов, которые они содержат .
Параметры javac подразделяются на три группы: стандартные, кросс-компиляционные и дополнительные. В этой статье мы сосредоточимся на стандартных и дополнительных опциях.
Параметры кросс-компиляции используются для менее распространенного случая компиляции определений типов в реализации JVM, отличной от среды компилятора, и не будут рассматриваться.
3. Определение типа
Давайте начнем с представления класса, который мы собираемся использовать для демонстрации опций javac :
public class Data { ListtextList = new ArrayList(); public void addText(String text) { textList.add(text); } public List getTextList() { return this.textList; } }
Исходный код помещается в файл com/baeldung/javac/Data.java .
Обратите внимание, что в этой статье мы используем разделители файлов *unix; на компьютерах с Windows мы должны использовать обратную косую черту (‘ \’ ) вместо прямой косой черты (‘ /’ ).
4. Стандартные опции
Одним из наиболее часто используемых стандартных параметров команды javac является -d , указывающий каталог назначения для сгенерированных файлов классов . Если тип не является частью пакета по умолчанию, создается структура каталогов, отражающая имя пакета, чтобы сохранить файл класса этого типа.
Давайте выполним следующую команду в каталоге, содержащем структуру, представленную в предыдущем разделе:
javac -d javac-target com/baeldung/javac/Data.java
Компилятор javac сгенерирует файл класса javac-target/com/baeldung/javac/Data.class . Обратите внимание, что в некоторых системах javac не создает автоматически целевой каталог, который в данном случае является javac-target . Поэтому, возможно, нам придется сделать это вручную.
Вот несколько других часто используемых вариантов:
- -cp (или -classpath , –class-path ) – указывает, где можно найти типы, необходимые для компиляции наших исходных файлов. Если этот параметр отсутствует, а переменная среды CLASSPATH не задана, вместо этого используется текущий рабочий каталог (как это было в приведенном выше примере).
- -p (или –путь к модулю ) – указывает расположение необходимых прикладных модулей. Эта опция применима только к Java 9 и выше – пожалуйста, обратитесь к этому учебнику для руководства по системе модулей Java 9.
Если мы хотим знать, что происходит в процессе компиляции, например, какие классы загружаются и какие компилируются, мы можем применить параметр -verbose .
Последний стандартный вариант, который мы рассмотрим, – это файл аргументов. Вместо того, чтобы передавать аргументы непосредственно инструменту javac , мы можем хранить их в файлах аргументов . Имена этих файлов с префиксом “@ “ затем используются в качестве аргументов команды.
Когда команда javac встречает аргумент , начинающийся с’@ ‘ , она интерпретирует следующие символы как путь к файлу и расширяет содержимое файла в список аргументов. Пробелы и символы новой строки могут использоваться для разделения аргументов, включенных в такой файл аргументов.
Предположим, что у нас есть два файла с именами options и types в каталоге javac-args со следующим содержимым:
Файл options :
-d javac-target -verbose
Файл types :
com/baeldung/javac/Data.java
Мы можем скомпилировать тип Data , как и раньше, с подробными сообщениями, напечатанными на консоли, выполнив эту команду:
javac @javac-args/options @javac-args/types
Вместо того, чтобы хранить аргументы в отдельных файлах, мы также можем хранить их все в одном файле .
Предположим, что в каталоге javac-args есть файл с именем arguments :
-d javac-target -verbose com/baeldung/javac/Data.java
Давайте передадим этот файл в javac , чтобы получить тот же результат, что и с двумя отдельными файлами до :
javac @javac-args/arguments
Обратите внимание, что варианты, которые мы рассмотрели в этом разделе, являются наиболее распространенными. Для получения полного списка стандартных javac опций ознакомьтесь с этой ссылкой .
5. Дополнительные опции
Дополнительные параметры javac -это нестандартные параметры, которые специфичны для текущей реализации компилятора и могут быть изменены в будущем. Поэтому мы не будем подробно рассматривать эти варианты.
Однако есть вариант, который очень полезен и заслуживает упоминания, -Xlint . Для получения полного описания других javac дополнительных опций перейдите по этой ссылке .
Опция -Xlint позволяет нам включать предупреждения во время компиляции . Существует два способа указать этот параметр в командной строке:
- -Xlint – запускает все рекомендуемые предупреждения
- -Xlint:клавиша[,клавиша]* – включает определенные предупреждения
Вот некоторые из самых удобных -Xlint клавиш:
- rawtypes – предупреждает об использовании необработанных типов
- unchecked – предупреждает о непроверенных операциях
- static – предупреждает о доступе к статическому члену от члена экземпляра
- cast – предупреждает о ненужных бросках
- serial – предупреждает о том, что сериализуемые классы не имеют serialVersionUID
- fallthrough – предупреждает о провале в операторе switch
Теперь создайте файл с именем xl в tops в каталоге javac-args со следующим содержимым:
-d javac-target -Xlint:rawtypes,unchecked com/baeldung/javac/Data.java
При выполнении этой команды:
javac @javac-args/xlint-ops
мы должны увидеть rawtypes и непроверенные предупреждения:
com/baeldung/javac/Data.java:7: warning: [rawtypes] found raw type: ArrayList ListtextList = new ArrayList(); ^ missing type arguments for generic class ArrayList where E is a type-variable: E extends Object declared in class ArrayList com/baeldung/javac/Data.java:7: warning: [unchecked] unchecked conversion List textList = new ArrayList(); ^ required: List found: ArrayList ...
6. Заключение
В этом учебном пособии описан инструмент javac , показывающий, как использовать параметры для управления типичным процессом компиляции.
На самом деле мы обычно компилируем программу с помощью IDE или инструмента сборки, а не напрямую полагаемся на javac . Однако глубокое понимание этого инструмента позволит нам настроить компиляцию в расширенных случаях использования.
Как всегда, исходный код этого учебника можно найти на GitHub .