我目前正在使用gradle,似乎可以通过java-plugin设置源兼容性和目标兼容性
我想知道我们使用源兼容性/目标兼容性而不是向后兼容旧版JDK的原因是什么?
如果没有设置sourcecompatibility/targetcompatibility,升级到最新的java会不会更容易?
是否应该使用源兼容性和目标兼容性?
发布于 2017-12-15 02:36:26
sourceCompatibility和targetCompatability变量与javac上的-source和-target开关直接相关。它们用于交叉编译(relevant documentation for javac、relevant SO question)。这些值的唯一目的是使您的类文件向后兼容。它们并没有真正起到任何其他作用。这是一个或多或少出于安全目的而添加的功能。您可以安装一个较新的JDK并使用这些值来编译您的代码,而不是在您的机器上安装一个较旧的、安全性较低的JDK。
但是,这些标志有一个主要的警告:仅仅因为您设置了这些值并不意味着您编写的代码可以在较旧的JVM上工作。这是因为虽然javac将编译您的类以使它们与旧的JVM兼容,但您仍然可能最终绑定到那个旧的JVM中不存在的方法。
例如,如果将兼容性值设置为'1.6',并且使用JDK8运行构建,则仍然可以像这样编写代码:
Objects.equals(obj1, obj2);编译器也不会抱怨。它仍然会继续构建,而不会抱怨这一行。但是,如果您尝试在Java6中运行它,您会得到一个错误,指出Objects.equals不存在,因为Objects是在Java7中引入的。
换句话说:-source和-target 使您的.class文件与旧的JVM兼容,但是它们不验证您的代码使用的类和方法。要做到这一点,唯一的方法是使用-bootclasspath,这时,您也可以直接下载并使用较旧的JDK进行编译,因为您必须这样做才能获得所需的rt.jar文件(relevant SO question)。
就升级而言,设置这些值并不一定会限制您的升级能力。如果您打算在该版本中使用您编写的代码,则它必须与您使用的任何值兼容,但没有什么能阻止您更改它们并开始使用更新的功能和API。
https://stackoverflow.com/questions/47819032
复制相似问题