"maven.compiler.release" 作为源和目标的替代品?
"maven.compiler.release" as an replacement for source and target?
我有两个关于 maven.compiler.release
-tag
的问题
我要更换
<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>
-属性,我是否也必须在插件中设置发布标签?
<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.release>12</maven.compiler.release>
就足够了。而且您也不需要设置 maven-compiler-plugin 的配置。发布标签的配置会自动获取。
bootclasspath 部分是使用 --release
选项自动完成的。文件大小与此无关...
如此简单的建议使用 JDK9+ 的 release
部分,否则 source/target...
另一个答案中的“简单建议”将无法正常工作,因为不幸的是情况并不简单。编译器选项的含义略有不同。 maven.compiler.source
和 maven.compiler.target
选项分别指的是源代码格式和生成的 class 文件的格式。但是他们没有像maven.compiler.release
那样考虑API变化。
因此,如果您盲目地只使用 <maven.compiler.source>8</maven.compiler.source>
和 <maven.compiler.target>8</maven.compiler.target>
,如果您使用 Java 11 构建,例如生成的 class 文件将支持 Java 8 但 API 可能仍依赖于 Java 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>
然后你需要在 <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 上,其他两个选项会将源代码和 class 文件格式设置为 Java 8,并且 API 将与 Java 8 兼容定义。
对每个参与者来说,更好的选择当然是尽快转到 Java 11。
我有两个关于 maven.compiler.release
-tag
我要更换
<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>
-属性,我是否也必须在插件中设置发布标签?
<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.release>12</maven.compiler.release>
就足够了。而且您也不需要设置 maven-compiler-plugin 的配置。发布标签的配置会自动获取。
bootclasspath 部分是使用 --release
选项自动完成的。文件大小与此无关...
如此简单的建议使用 JDK9+ 的 release
部分,否则 source/target...
另一个答案中的“简单建议”将无法正常工作,因为不幸的是情况并不简单。编译器选项的含义略有不同。 maven.compiler.source
和 maven.compiler.target
选项分别指的是源代码格式和生成的 class 文件的格式。但是他们没有像maven.compiler.release
那样考虑API变化。
因此,如果您盲目地只使用 <maven.compiler.source>8</maven.compiler.source>
和 <maven.compiler.target>8</maven.compiler.target>
,如果您使用 Java 11 构建,例如生成的 class 文件将支持 Java 8 但 API 可能仍依赖于 Java 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>
然后你需要在 <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 上,其他两个选项会将源代码和 class 文件格式设置为 Java 8,并且 API 将与 Java 8 兼容定义。
对每个参与者来说,更好的选择当然是尽快转到 Java 11。