存在maven enforcer plugin它可以强制构建仅在特定 JDK 版本上运行。
我想知道是否有任何实际理由可以这样做? 我们已经构建了配置来指定源版本和目标版本。据我了解,这应该绰绰有余,因为 Java 是向后兼容的。例如它在 gradle 中的样子:
compileJava {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
这就是它在 maven 中的样子:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
如果您发现需要确切 jdk 版本的任何理由 - 请您也写下来。
更新。 问题更多是关于使用 8、9、10 或 11 的 JDK 编译版本 8 的 java 源/目标项目是否有任何实际差异...
最佳答案
造成这种情况的主要原因可能是在较新的 JDK 编译器中进行了一些更好的优化。因此,即使目标字节码 级别 与旧编译器相同,目标字节码本身也可能会得到改进。
According to Brian Goetz , 这会增加它的重量:
There are times when a better translation from source code to bytecode is made possible by JVM improvements. For example, prior to 5,
Foo.class
was translated to reflective call; after, to LDC.So, you may reasonably want to stick to a given language level across an org (because of shared code) but specific apps can still take advantage of VM improvements.
编辑:抱歉!引用的推文是关于编译源低于目标(例如-source 8 -target 11
),因此它与OP询问的内容不同。尽管如此,即使目标保持不变,更新的编译器也许可以生成更好的字节码。
附言。根据 Basil 的建议, 让我提一下 javac --release
flag JDK 9+,这可以防止在坚持旧语言级别的同时使用较新 JDK 的 API。
关于java - 是否有实际理由强制构建 JDK 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54496735/