java - 是否有实际理由强制构建 JDK 版本?

标签 java maven gradle

存在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/

相关文章:

Java RMI : running RMI application over the Internet with public IP of router

java - 包含 ejb 3.1 和 jsf 页面的依赖项 jar

android - java.lang.NoClassDefFoundError : com. acme.R$layout 引用 android 库

java - Gradle 下载源码依赖

java - SQL异常错误

java - 代码签名和编写步骤 public static void main(String args[] )

java - 通过 MOM 在 WAS 集群内传播配置

java - 公开类,但对 JAR 文件保持私有(private)

java - Selenium Java 立即处理对象(警报对话框)异常。 (不可预测的Java弹出窗口)

intellij-idea - Gradle依赖问题-Apache Storm