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.foreach.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.foreach.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.foreach.maven.java9.MavenCompilerPlugin
Ошибка возникает из-за того, что этот пакет находится в отдельном модуле, который мы еще не включили в нашу сборку.
Самый простой способ решить эту проблему — создать класс module-info.java
и указать, что нам нужен модуль java.xml
:
module com.foreach.maven.java9 {
requires java.xml;
}
Теперь мы можем попробовать еще раз:
mvn -q clean compile exec:java
-Dexec.mainClass="com.foreach.maven.java9.MavenCompilerPlugin"
И наш вывод будет:
The XML namespace prefix is: xml
5. Вывод
В этой статье мы рассмотрели плагин компилятора
и описали, как его использовать. Мы также узнали о поддержке Maven для Java 9.
Полный исходный код этого руководства можно найти на GitHub .