maven - "maven.compiler.release"作为源和目标的替代?

标签 maven maven-compiler-plugin

我有两个关于 maven.compiler.release 的问题-标签
我想更换

<properties>
    <maven.compiler.source>12</maven.compiler.source>
    <maven.compiler.target>12</maven.compiler.target>
</properties>
<properties>
     <maven.compiler.release>12</maven.compiler.release>
</properties>
如果我使用 <maven.compiler.release> -property,我是否也必须在插件中设置发布标签?
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <!-- do I need that ? -->
        <release>12</release>
    </configuration>
</plugin>
根据 https://www.baeldung.com/maven-java-version ,它被设置为两者。
如果我使用 maven.compiler.release而不是 maven.compiler.sourcemaven.compiler.target ,然后 -bootclasspath也已设置并将进行交叉编译。 这是什么意思?将编译文件大小设置为-bootclasspath更大还是编译需要更多时间?

最佳答案

另一个答案中的“简单建议”无法正常工作,因为不幸的是情况并不简单。编译器选项的含义略有不同。 maven.compiler.sourcemaven.compiler.target选项分别指源代码格式和生成的类文件的格式。但是他们没有将 API 更改考虑在内,因为 maven.compiler.release做。
所以如果你盲目地使用 <maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target> ,例如,如果您使用 Java 11 构建,则生成的类文件将支持 Java 8,但 API 可能仍依赖于 Java 11 更改并在 Java 8 上运行时中断。请参阅 How should javac 11 link methods overridden in later versions with a Java 8 target?更多讨论。
如果您想指定 Java 8 但在 Java 9+ 上构建,则解决方案并不那么简单。您需要使用 Java 8 支持的编译器选项指定源和目标:

<properties>
  <maven.compiler.source>8</maven.compiler.source>
  <maven.compiler.target>8</maven.compiler.target>
</properties>
然后你需要在 <profiles> 中设置一个单独的配置文件仅在 Java 9+ 中激活以打开 maven.compiler.release 的部分选项:
<profile>
  <id>java-8-api</id>
  <activation>
    <jdk>[9,)</jdk>
  </activation>
  <properties>
    <maven.compiler.release>8</maven.compiler.release>
  </properties>
</profile>
那样的话,如果你在 Java 9+ 上构建,maven.compiler.release将生效并限制 API 与 Java 8 兼容。如果您在 Java 8 上构建,其他两个选项会将源代码和类文件格式设置为 Java 8,并且 API 将根据定义与 Java 8 兼容。
对于所有相关人员来说,更好的选择当然是尽快迁移到 Java 11。

关于maven - "maven.compiler.release"作为源和目标的替代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59049980/

相关文章:

java - Intellij maven项目编译 fatal error : invalid flag: --release

java - maven-compiler-plugin 3.0 不编译 maven 下的资源文件夹

java - 一个maven项目的多个pom文件

maven - 在 Maven 构建中包含 yajsw

java - AspectJ 没有编译

java - 如何将 "add Maven nature"添加到现有的 netbeans 项目?

java - JPADatabase 的 jooq codegen 无法正常工作

java - 插件 org.apache.maven.plugins :maven-compiler-plugin or one of its dependencies could not be resolved

java - Maven插件执行失败

java - 如何使用 maven-compiler-plugin 配置 Lombok?