我目前正在使用gradle,似乎我可以通过java-plugin设置sourcecompatibility和targetcompatibility
我想知道除了与旧JDK向后兼容之外,我们使用sourcecompatibility / targetcompatibility的原因是什么?
如果没有设置sourcecompatibility / targetcompatibility,那么升级到最新的java会更容易吗?是否应该使用源兼容性和目标兼容性?
答案 0 :(得分:1)
sourceCompatibility
和targetCompatability
变量与-source
上的-target
和javac
开关直接相关。这些用于交叉编译(relevant documentation for javac
,relevant 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。