Maven Compiler插件

2023/05/24

1. 概述

本快速教程介绍了Compile插件,它是Maven构建工具的核心插件之一。

有关其他核心插件的概述,请参阅本文

2. 插件Goals(目标)

compiler插件用于编译Maven项目的源代码,这个插件有两个目标,它们已经绑定到默认生命周期的特定阶段:

  • compile:编译主要源文件
  • testCompile:编译测试源文件

以下是POM中的编译器插件:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
         ... 
    </configuration>
</plugin>

我们可以在这里找到这个插件的最新版本。

3. 配置

默认情况下,编译器插件编译与Java 5兼容的源代码,并且生成的class文件也可以与Java 5一起使用,而不管使用的是什么JDK。我们可以在<configuration>标签中修改这些设置:

<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编译器,这就是<compilerArgs>参数派上用场的地方。

例如,我们可以为编译插件指定以下配置以警告unchecked的操作:

<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] /D:/workspace/intellij/taketoday-tutorial4j/maven.modules/compiler-plugin-java-9/src/main/java/cn/tuyucheng/taketoday/maven/java9/Data.java:[7,33] 
未经检查的转换
  需要: java.util.List<java.lang.String>
  找到:    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在3.5.0中添加了对Java 9的支持,因此我们至少需要这个版本及以上的Maven版本,并且还需要至少3.8.0版本的maven-compiler-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</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="cn.tuyucheng.taketoday.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 cn.tuyucheng.taketoday.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 cn.tuyucheng.taketoday.maven.java9.MavenCompilerPlugin

这个错误来自于这个包在一个单独的模块中,而我们还没有将其包含在我们的构建中。

解决这个问题的最简单方法是创建module-info.java类并指明我们需要java.xml模块:

module cn.tuyucheng.taketoday.maven.java9 {
    requires java.xml;
}

现在我们可以再试一次:

mvn -q clean compile exec:java -Dexec.mainClass="cn.tuyucheng.taketoday.maven.java9.MavenCompilerPlugin"

我们的输出将是:

The XML namespace prefix is: xml

5. 总结

在本文中,我们介绍了编译器插件并描述了如何使用它,我们还了解了Maven对Java 9的支持。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章