«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.

Next »

Quick Guide to the Maven Install Plugin

« Previous

Maven Resources Plugin