java - 源兼容性 目标兼容性 使用原因

标签 java gradle

我目前正在使用gradle,似乎我可以通过java-plugin设置源兼容性和目标兼容性

我想知道除了向后兼容旧版 JDK 之外,我们使用源兼容性/目标兼容性的原因是什么?

如果未设置源兼容性/目标兼容性,升级到最新的 java 会更容易吗?

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

最佳答案

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

不过,这些标志有一个主要警告:仅仅因为您设置了这些值并不意味着您编写的代码可以在较旧的 JVM 上运行。这是因为虽然 javac将编译您的类以使它们与较旧的 JVM 兼容,但您仍然可能最终绑定(bind)到较旧的 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。

关于java - 源兼容性 目标兼容性 使用原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47819032/

相关文章:

java - 单次执行后关闭 PreparedStatement——这是设计缺陷吗?

android - Android Studio 2.0 Gradle Project使用gradle:2.0.0无法成功构建

java - 如何使用java上传dropbox中的多个文件

java - 将结果集的行存储在字符串数组中

java - 重写 gradle 代码以兼容 5.1

kotlin - 与Kotlin DSL兼容,期望出现Property <String>错误

maven - 继承 Gradle 中的行为?

jenkins - Jenkins使用Gradle守护程序构建失败

java - 如何将Jar转为exe或msi包进行远程部署?

java - 进度条结束后 JDialog 落后