«1. Обзор
В этом кратком руководстве представлен подключаемый модуль компилятора, один из основных подключаемых модулей инструмента сборки Maven.
Обзор других основных плагинов см. в этой статье.
2. Цели плагина
Плагин компилятора используется для компиляции исходного кода проекта Maven. У этого плагина две цели, которые уже привязаны к определенным фазам жизненного цикла по умолчанию:
-
compile — компиляция основных исходных файлов testCompile — компиляция тестовых исходных файлов
Вот плагин компилятора в POM: ~~ ~
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
...
</configuration>
</plugin>
Мы можем найти последнюю версию этого плагина здесь.
3. Конфигурация
По умолчанию подключаемый модуль компилятора компилирует исходный код, совместимый с Java 5, а сгенерированные классы также работают с Java 5 независимо от используемого JDK. Мы можем изменить эти настройки в элементе конфигурации:
<configuration>
<source>1.8</source>
<target>1.8</target>
<-- other customizations -->
</configuration>
Для удобства мы можем установить версию Java как свойства POM:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Иногда мы хотим передать аргументы компилятору javac. Здесь пригодится параметр компилятораргс.
Например, мы можем указать следующую конфигурацию для предупреждения компилятором о непроверенных операциях:
<configuration>
<!-- other configuration -->
<compilerArgs>
<arg>-Xlint:unchecked</arg>
</compilerArgs>
</configuration>
При компиляции этого класса:
public class Data {
List<String> textList = new ArrayList();
public void addText(String text) {
textList.add(text);
}
public List getTextList() {
return this.textList;
}
}
мы увидим в консоли предупреждение о непроверенных операциях: ~ ~~
[WARNING] ... Data.java:[7,29] unchecked conversion
required: java.util.List<java.lang.String>
found: java.util.ArrayList
Поскольку обе цели подключаемого модуля компилятора автоматически привязаны к фазам жизненного цикла Maven по умолчанию, мы можем выполнить эти цели с помощью команд mvn compile и mvn test-compile.
4. Обновления Java 9
4.1. Конфигурация
До Java 8 мы использовали номер версии как 1.x, где x представляет версию Java, например 1.8 для Java 8.
Для Java 9 и выше мы можем просто использовать номер версии напрямую:
<configuration>
<source>9</source>
<target>9</target>
</configuration>
Точно так же мы можем определить версию, используя свойства как:
<properties>
<maven.compiler.source>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
</properties>
Maven добавил поддержку Java 9 в 3.5.0, поэтому нам понадобится как минимум эта версия. Нам также понадобится плагин maven-compiler-plugin версии не ниже 3.8.0:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins>
</build>
4.2. Сборка
Теперь пришло время протестировать нашу конфигурацию.
Во-первых, давайте создадим класс MavenCompilerPlugin, в котором мы импортируем пакет из другого модуля.
Простой пример — javax.xml.XMLConstants.XML_NS_PREFIX:
public class MavenCompilerPlugin {
public static void main(String[] args) {
System.out.println("The XML namespace prefix is: "
+ XML_NS_PREFIX);
}
}
Далее давайте скомпилируем его:
mvn -q clean compile exec:java
-Dexec.mainClass="com.baeldung.maven.java9.MavenCompilerPlugin"
Однако при использовании значений по умолчанию для Java 9 мы получим ошибку: ~~ ~
[ERROR] COMPILATION ERROR :
[ERROR] .../MavenCompilerPlugin.java:[3,20]
package javax.xml is not visible
(package javax.xml is declared in module java.xml,
but module com.baeldung.maven.java9 does not read it)
[ERROR] .../MavenCompilerPlugin.java:[3,1]
static import only from classes and interfaces
[ERROR] .../MavenCompilerPlugin.java:[7,62]
cannot find symbol
symbol: variable XML_NS_PREFIX
location: class com.baeldung.maven.java9.MavenCompilerPlugin
Ошибка возникает из-за того, что этот пакет находится в отдельном модуле, который мы еще не включили в нашу сборку.
Самый простой способ решить эту проблему — создать класс module-info.java и указать, что нам нужен модуль java.xml:
module com.baeldung.maven.java9 {
requires java.xml;
}
Теперь мы можем попробовать еще раз:
mvn -q clean compile exec:java
-Dexec.mainClass="com.baeldung.maven.java9.MavenCompilerPlugin"
И наш вывод будет:
The XML namespace prefix is: xml
5. Заключение
В этой статье мы рассмотрели подключаемый модуль компилятора и описали, как его использовать. Мы также узнали о поддержке Maven для Java 9.
Полный исходный код этого руководства можно найти на GitHub.