“maven.compiler.release”作为源和目标的替代品?

nim*_*o23 13 maven maven-compiler-plugin

我有两个关于maven.compiler.release-tag 的问题

我想更换

<properties>
    <maven.compiler.source>12</maven.compiler.source>
    <maven.compiler.target>12</maven.compiler.target>
</properties>
Run Code Online (Sandbox Code Playgroud)

到

<properties>
     <maven.compiler.release>12</maven.compiler.release>
</properties>
Run Code Online (Sandbox Code Playgroud)

如果我使用<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>
Run Code Online (Sandbox Code Playgroud)

根据https://www.baeldung.com/maven-java-version,它被设置为两者。

如果我使用maven.compiler.release而不是maven.compiler.sourceand maven.compiler.target,那么-bootclasspath也会被设置并且会进行交叉编译。这是什么意思?使用 set 的编译文件大小-bootclasspath会更大还是编译需要更多时间?

Gar*_*son 22

另一个答案中的“简单建议”无法正常工作,因为不幸的是情况并不简单。编译器选项的含义略有不同。在maven.compiler.source和maven.compiler.target选项分别指的是源代码格式,生成的类文件的格式。但是他们没有像maven.compiler.release那样考虑 API 的变化。

因此,如果您盲目地使用<maven.compiler.source>8</maven.compiler.source>and <maven.compiler.target>8</maven.compiler.target>,例如,如果您使用 Java 11 构建,则生成的类文件将支持 Java 8,但 API 可能仍依赖于 Java 11 更改并在 Java 8 上运行时中断。请参阅javac 11 链接方法如何被覆盖在具有 Java 8 目标的更高版本中?更多讨论。

如果您想指定 Java 8 但在 Java 9+ 上构建,则解决方案并不那么简单。您需要使用 Java 8 支持的编译器选项指定源和目标:

<properties>
  <maven.compiler.source>8</maven.compiler.source>
  <maven.compiler.target>8</maven.compiler.target>
</properties>
Run Code Online (Sandbox Code Playgroud)

然后,您需要在<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>
Run Code Online (Sandbox Code Playgroud)

这样,如果您在 Java 9+ 上构建,maven.compiler.release将生效并限制 API 与 Java 8 兼容。如果您在 Java 8 上构建,其他两个选项会将源代码和类文件格式设置为 Java 8,并且根据定义,API 将与 Java 8 兼容。

对于所有相关人员来说,更好的选择当然是尽快迁移到 Java 11。

  • 对于 JDK &lt;= 8,使用 &lt;maven.compiler.release&gt; 构建将失败:致命错误编译:无效标志:--release (2认同)

khm*_*ise 6

简单的属性<maven.compiler.release>12</maven.compiler.release>就足够了。而且您也不需要为 maven-compiler-plugin 设置配置。发布标记的配置会自动选取。引导类路径部分是通过使用该--release选项自动完成的。文件的大小与此无关...

如此简单的建议将release部分用于 JDK9+ 否则源/目标...