1. Обзор

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

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

2. Команда javac

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

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

javac [options] [source-files]

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

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

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

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

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

Исходный код находится в файле com/baeldung/javac/Data. Ява.

public class Data {
    List<String> textList = new ArrayList();

    public void addText(String text) {
        textList.add(text);
    }

    public List getTextList() {
        return this.textList;
    }
}

Обратите внимание, что в этой статье мы используем разделители файлов *nix; на машинах Windows мы должны использовать обратную косую черту (‘\\’) вместо прямой косой черты (‘/’).

4. Стандартные опции

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

Давайте выполним следующую команду в каталоге, содержащем структуру, представленную в предыдущем разделе:

Компилятор javac создаст файл класса javac-target/com/baeldung/javac/Data.class. Обратите внимание, что в некоторых системах javac не создает автоматически целевой каталог, которым в данном случае является javac-target. Поэтому нам может потребоваться сделать это вручную.

javac -d javac-target com/baeldung/javac/Data.java

Вот несколько других часто используемых опций:

-cp (или -classpath, — class-path) — указывает, где можно найти типы, необходимые для компиляции наших исходных файлов. Если этот параметр отсутствует и переменная среды CLASSPATH не задана, вместо нее используется текущий рабочий каталог (как в примере выше). -p (или – путь к модулю) – указывает расположение необходимых модулей приложения. Эта опция применима только к Java 9 и более поздним версиям — пожалуйста, обратитесь к этому учебнику за руководством по модульной системе Java 9.

    Если мы хотим знать, что происходит во время процесса компиляции, например. какие классы загружаются, а какие компилируются, мы можем применить параметр -verbose.

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

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

Предположим, у нас есть два файла с именами опций и типов в каталоге javac-args со следующим содержимым:

Файл опций:

Файл типов:

-d javac-target
-verbose

Мы можем скомпилировать тип данных, как и раньше, с подробными сообщениями, напечатанными на консоли, выполнив эту команду:

com/baeldung/javac/Data.java

Вместо того, чтобы хранить аргументы в отдельных файлах, мы также можем хранить их все в одном файле.

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:key[,key]* — включает определенные предупреждения

Вот некоторые из самых удобных — Ключи Xlint:

    rawtypes — предупреждает об использовании необработанных типов unchecked — предупреждает о непроверенных операциях static — предупреждает о доступе к статическому члену из экземпляра приведения члена — предупреждает о ненужных приведениях serial – предупреждает о том, что сериализуемые классы не имеют провала serialversionUID – предупреждает о провале в операторе switch

Теперь создайте файл с именем xlint-ops в каталоге javac-args со следующим содержимым:

-d javac-target
-Xlint:rawtypes,unchecked
com/baeldung/javac/Data.java

При выполнении этой команды:

javac @javac-args/xlint-ops

мы должны увидеть необработанные типы и непроверенные предупреждения:

com/baeldung/javac/Data.java:7: warning: [rawtypes] found raw type: ArrayList
    List<String> textList = new ArrayList();
                                ^
  missing type arguments for generic class ArrayList<E>
  where E is a type-variable:
    E extends Object declared in class ArrayList
com/baeldung/javac/Data.java:7: warning: [unchecked] unchecked conversion
    List<String> textList = new ArrayList();
                            ^
  required: List<String>
  found:    ArrayList
...

6. Заключение

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

На самом деле мы обычно компилируем программу с помощью IDE или инструмента сборки, а не напрямую полагаемся на javac. Тем не менее, хорошее понимание этого инструмента позволит нам настроить компиляцию в продвинутых случаях использования.

Как всегда, исходный код этого руководства можно найти на GitHub.

«