【问题标题】:Configure maven-compiler-plugin so it works both with JDK-8 and JDK-12 (in Spring Boot project)配置 maven-compiler-plugin 使其适用于 JDK-8 和 JDK-12(在 Spring Boot 项目中)
【发布时间】:2019-03-28 18:32:32
【问题描述】:

是否可以配置 maven-compiler-plugin 使其同时与 JDK 8 JDK 12 一起工作?我不确定它是否相关,但它是一个 Spring Boot 项目。

1.配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <release>8</release>
    </configuration>
</plugin>

在JDK-12下可以编译,但是在JDK-8下编译失败:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project xxxx: 
Fatal error compiling: invalid flag: --release 

2.配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>

缺少&lt;release&gt;8&lt;/release&gt;参数的在JDK-8下是可以编译的,但是在JDK-12下就不行了:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project xxxx:
Fatal error compiling: CompilerException: NullPointerException

我发现所有可能的 Internet 资源都建议使用 &lt;release&gt;8&lt;/release&gt; 参数来避免 JDK-12 下的错误,但这会禁用 JDK-8 下的可编译性。

我们的源代码和目标代码兼容性是 Java 8,我们需要在使用 JDK-12 的开发人员机器上使用良好的旧纯 mvn clean install(不提供配置文件!)构建代码,还有在 Jenkins 上,我们仍然要保留 JDK-8,而且我们也有一些保守的开发人员:)

【问题讨论】:

    标签: java maven spring-boot build maven-compiler-plugin


    【解决方案1】:

    首先你应该像这样在 pluginManagement 中定义 maven-compiler-plugin:

      <build>
        <pluginManagement>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
          <...>
        ...
    

    以及使用自动激活的配置文件,如下所示:

      <profiles>
        <profile>
          <id>jkd-12-compile</id>
          <activation>
            <jdk>12</jdk>
          </activation>
          <build>
            <pluginManagement>
              <plugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <configuration>
                    <release>8</release>
                  </configuration>
                </plugin>
              </plugins>
            </pluginManagement>
          </build>
        </profile>
        <profile>
          <id>jdk-8-compile</id>
          <activation>
            <jdk>[,8]</jdk>
          </activation>
          <build>
            <pluginManagement>
              <plugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <configuration>
                    <source>8</source>
                    <target>8</target>
                  </configuration>
                </plugin>
              </plugins>
            </pluginManagement>
          </build>
        </profile>
      </profiles>
    

    通常不需要mvn clean install。你通常只需要mvn clean verify...

    【讨论】:

    • 最后,它适用于&lt;jdk&gt;(,9)&lt;/jdk&gt;&lt;jdk&gt;[9,)&lt;/jdk&gt;。因为&lt;jdk&gt;[,8]&lt;/jdk&gt;8.0.152 之类的版本有问题...非常感谢!
    • 顺便说一句,你能解释一下为什么需要这一切吗?我不是指配置文件,这些很清楚,但为什么我不能对所有 JDK 只使用一个配置。我尝试了一个带有纯 Java 命令行“Hello world”的 POM 配置,这在所有 JDK 下都是一样的。是因为 Spring Boot 中的某些东西吗?
    • 由于保密协议,这不会那么容易。有时间我会尝试提取一个匿名的 MCVE。
    【解决方案2】:

    一个更简单的解决方案依赖于使用属性而不是显式配置条目。它不会抱怨任何它不支持的东西。

    <properties>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
    <profiles>
      <profile>
        <id>jdk9+</id>
        <activation>
          <jdk>[9,)</jdk>
        </activation>
        <properties>
          <maven.compiler.release>8</maven.compiler.release>
        </properties>
      </profile>
    </profiles>
    

    享受吧!

    【讨论】:

    • 这很好。您可以只添加在检测到 JDK 8 具有功能齐全的配置文件部分时应该处于活动状态的配置文件,我认为这会使您的答案看起来更好。
    • @Paulo maven.compiler.targetmaven.compiler.source 可能会留在主要的 properties 部分,因为它们将被 9+ 忽略
    • 太棒了!既然您已经将属性与配置文件放在一起,这个解决方案肯定会更好。谢谢!
    • @greut - 我如何准确找出要在属性标签中设置的版本?我想使用 Java 10。我应该将版本设置为 10 还是 1.10 ?
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 2018-03-01
    • 2020-01-01
    • 2016-05-26
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多