Перейти к основному содержимому

Плагин компилятора Maven

· 4 мин. чтения

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 .