sourcecompatiblity targetcompatibility使用原因

时间:2017-12-14 17:29:02

标签: java gradle

我目前正在使用gradle,似乎我可以通过java-plugin设置sourcecompatibility和targetcompatibility

我想知道除了与旧JDK向后兼容之外,我们使用sourcecompatibility / targetcompatibility的原因是什么?

如果没有设置sourcecompatibility / targetcompatibility,那么升级到最新的java会更容易吗?

是否应该使用源兼容性和目标兼容性?

1 个答案:

答案 0 :(得分:1)

sourceCompatibilitytargetCompatability变量与-source上的-targetjavac开关直接相关。这些用于交叉编译(relevant documentation for javacrelevant SO question)。这些值的唯一目的是使您的类文件向后兼容。他们并没有真正服务于任何其他目的。这是为了安全目的或多或少添加的功能。您可以安装较新的JDK,并使用这些值来编译代码,而不是在计算机上安装较旧的,安全性较低的JDK。

这些标志有一个主要的警告:仅仅因为你设置这些值并不意味着你编写的代码将适用于较旧的JVM。这是因为虽然javac将编译您的类以使它们与较旧的JVM兼容,但您仍然可以最终绑定到该旧JVM中不存在的方法。

例如,如果将兼容性值设置为'1.6'并且使用JDK 8运行构建,则仍可以编写如下代码:

Objects.equals(obj1, obj2);

编译器不会抱怨。它仍然会在没有抱怨这条线的情况下建立。但是,如果您尝试使用Java 6运行它,则会收到一条错误消息,指出Objects.equals不存在,因为Java 7中引入了Objects

换句话说:-source-target 使您的.class文件与旧JVM兼容,但不验证使用的类和方法通过你的代码。唯一的方法是使用-bootclasspath,此时,您也可以使用较旧的JDK下载和编译,因为您必须这样做才能获得所需的rt.jar文件({ {3}})。

就升级而言,设置这些值并不一定会限制您的升级能力。您编写的代码必须与您在该版本中使用它时使用的任何值兼容,但没有什么能阻止您更改它们并开始使用更新的功能和API。