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