我有两个关于 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.source
和 maven.compiler.target
,然后 -bootclasspath
也已设置并将进行交叉编译。 这是什么意思?将编译文件大小设置为-bootclasspath
更大还是编译需要更多时间?
最佳答案
另一个答案中的“简单建议”无法正常工作,因为不幸的是情况并不简单。编译器选项的含义略有不同。 maven.compiler.source
和 maven.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/