Рубрики
Без рубрики

Компиляция файлов Java *.class с помощью javac

Узнайте, как использовать javac для создания файлов *.class.

Автор оригинала: Nguyen Nam Thai.

1. Обзор

В этом руководстве будет представлен инструмент javac и описано, как использовать его для компиляции исходных файлов Java в файлы классов.

Мы начнем с краткого описания команды javac , а затем рассмотрим инструмент более подробно, рассмотрев его различные варианты.

2. Команда javac

Мы можем указать параметры и исходные файлы при выполнении инструмента javac :

javac [options] [source-files]

Где [параметры] обозначает параметры, управляющие операциями инструмента, и [исходные файлы] указывает один или несколько исходных файлов, которые будут скомпилированы.

Все варианты действительно совершенно необязательны. Исходные файлы могут быть непосредственно указаны в качестве аргументов команды javac или сохранены в файле аргументов, на который ссылается ссылка, как описано ниже. Обратите внимание, что исходные файлы должны быть расположены в иерархии каталогов, соответствующей полным именам типов, которые они содержат .

Параметры javac подразделяются на три группы: стандартные, кросс-компиляционные и дополнительные. В этой статье мы сосредоточимся на стандартных и дополнительных опциях.

Параметры кросс-компиляции используются для менее распространенного случая компиляции определений типов в реализации JVM, отличной от среды компилятора, и не будут рассматриваться.

3. Определение типа

Давайте начнем с представления класса, который мы собираемся использовать для демонстрации опций javac :

public class Data {
    List textList = 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
    List textList = 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 .