【问题标题】:sourcecompatiblity targetcompatibility usage reasonssourcecompatiblity targetcompatibility 使用原因
【发布时间】:2018-05-28 21:04:31
【问题描述】:

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

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

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

是否应该使用 sourcecompatibility 和 targetcompatibility ?

【问题讨论】:

    标签: java gradle


    【解决方案1】:

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

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

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

    Objects.equals(obj1, obj2);
    

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

    换一种说法:-source-target 使您的 .class 文件与旧版 JVM 兼容,但它们不验证代码使用的类和方法。做到这一点的唯一方法是使用-bootclasspath,此时,您最好下载并使用较旧的JDK 进行编译,因为您必须这样做才能获得所需的rt.jar 文件(relevant SO question)。

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

    【讨论】:

      猜你喜欢
      • 2013-05-15
      • 2018-08-08
      • 1970-01-01
      • 2017-06-29
      • 2011-09-16
      • 2010-12-26
      • 2010-11-18
      • 2013-12-18
      • 1970-01-01
      相关资源
      最近更新 更多