java – 是否有实际的推理来强制构建JDK版本?

存在 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版本 – 请你写下来.

UPD.
问题更多的是如果用JDK的8,9,10或11编译java源/目标版本8的项目是否有任何实际差异…

解决方法

这样做的主要原因可能是在较新的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所询问的不同.尽管如此,即使目标保持不变,也许较新的编译器可以产生更好的字节码.

PS.正如Basil所告知的那样,让我提一下JDK 9的javac --release flag,它可以防止在坚持使用较旧的语言级别时使用较新的JDK的API.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...