Компиляция файлов Java ** .class с помощью javac
В этом руководстве будет представлен инструмент javac и описано, как его использовать для компиляции исходных файлов Java в файлы классов.
Мы начнем с краткого описания команды javac , а затем более подробно рассмотрим инструмент, рассмотрев его различные варианты.
2. Javac Command
Мы можем указать параметры и исходные файлы при запуске инструмента javac :
javac[options][source-files]---- Где __[options]__ обозначает параметры, управляющие операциями инструмента, а __[source-files]__ указывает один или несколько исходных файлов, которые нужно скомпилировать. Все варианты действительно полностью необязательны. Исходные файлы могут быть непосредственно указаны в качестве аргументов команды __javac__ или сохранены в указанном файле аргументов, как описано далее. ** Обратите внимание, что исходные файлы должны быть расположены в иерархии каталогов, соответствующей полностью определенным именам типов, которые они содержат ** . Параметры __javac__ подразделяются на три группы: стандартные, кросс-компиляция и дополнительные. В этой статье мы остановимся на стандартных и дополнительных опциях. Параметры кросс-компиляции используются для менее распространенного варианта компиляции определений типов для реализации JVM, отличной от среды компилятора, и не будут рассматриваться. === ** 3. Определение типа ** Начнем с представления класса, который мы будем использовать для демонстрации параметров __javac__: [source,java,gutter:,true]
public class Data < ListtextList = new ArrayList();
public void addText(String text)
Исходный код помещается в файл __com/baeldung/javac/Data.java__. Обратите внимание, что в этой статье мы используем разделители файлов ** nix; на компьютерах с Windows мы должны использовать обратную косую черту (‘__ \’ __) вместо прямой косой черты (‘__/’ __). === ** 4. Стандартные опции ** Одним из наиболее часто используемых стандартных параметров команды __javac__ является __-d__, ** указывающий каталог назначения для сгенерированных файлов классов ** . Если тип не является частью пакета по умолчанию, создается структура каталога, отражающая имя пакета, чтобы сохранить файл класса этого типа. Давайте выполним следующую команду в каталоге, содержащем структуру, представленную в предыдущем разделе: [source,bash,gutter:,true]
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__ (или __ – module-path__) - ** указывает на местоположение необходимого прикладные модули. Эта опция применима только к Java 9 и выше - пожалуйста, обратитесь к ссылке:/project-jigsaw-java-modularity[это руководство]для руководства к модульной системе Java 9. Если мы хотим знать, что происходит во время процесса компиляции, например, какие классы загружены, а какие скомпилированы, мы можем применить параметр __-verbose__. Последний стандартный вариант, который мы рассмотрим, это файл аргументов. ** Вместо передачи аргументов непосредственно в инструмент __javac__, мы можем сохранить их в файлах аргументов ** . Имена этих файлов с префиксом «‘ @ __‘__ »затем используются в качестве аргументов команды. Когда команда __javac__ встречает аргумент, начинающийся с ‘@ __‘__, она интерпретирует следующие символы как путь к файлу и расширяет содержимое файла в список аргументов. Пробелы и символы новой строки могут использоваться для разделения аргументов, включенных в такой файл аргументов. Предположим, у нас есть два файла с именами __options__ и __types__ в каталоге __javac-args__ со следующим содержимым: Файл __options__: [source,text,gutter:,true]
Файл __types__: [source,text,gutter:,true]
Компиляция файлов 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 со следующим содержимым: