160

sourceCompatibility和之间有什么关系/区别targetCompatibility?当它们被设置为不同的值时会发生什么?

根据Gradle 文档

sourceCompatibility是“编译 Java 源代码时使用的 Java 版本兼容性”。 targetCompatibility是“为其生成类的 Java 版本”。

我的理解是,targetCompatibility它将生成与特定版本的 Java 兼容的 java 字节码,这是功能的子集sourceCompatibility吗?

4

5 回答 5

95

targetCompatibilitysourceCompatibility映射到-target releasejavac -source release。源基本上是源语言级别,目标是生成的字节码级别。

更多细节可以在 javac的交叉编译部分中找到。

于 2013-05-21T09:07:05.590 回答
80

使用这些时要小心;我们一直被做出假设的人所困扰。

仅仅因为您使用 1.5 的 sourceCompability(或 targetCompatibility)并不意味着您始终可以使用 JDK 1.6 编译您的代码并期望它在 JDK 1.5 下工作。问题是可用的库。

如果您的代码碰巧调用了某些仅在 JDK 1.6 中可用的方法,它仍将使用目标 VM 的各种兼容性选项进行编译。但是当你运行它时,它会失败,因为有问题的方法不存在(你会得到一个 MethodNotFoundException 或 ClassNotFoundException)。

出于这个原因,我总是将 Compatibility 设置与我正在构建的实际 Java 版本进行比较。如果它们不匹配,我将无法构建。

于 2014-03-11T13:22:28.970 回答
40

sourceCompatibility = 指定用于编译.java文件的 Java 编程语言版本。例如 sourceCompatibility 1.6 = 指定 Java 编程语言的 1.6 版用于编译.java文件。

默认情况下 sourceCompatibility = "当前使用的 JVM 版本" 和 targetCompatibility = sourceCompatibility

targetCompatibility = 该选项确保生成的类文件与 targetCompatibility 指定的 VM 兼容。请注意,在大多数情况下,-target 选项的值是 -source 选项的值;在这种情况下,您可以省略 -target 选项。

类文件将在 targetCompatibility 指定的目标和更高版本上运行,但不会在 VM 的早期版本上运行

于 2015-04-08T15:33:38.623 回答
0

在我看来,“sourceCompatibility”意味着您可以在源代码中使用什么功能。例如,如果您将 sourceCompatibility 设置为 1.7,那么即使您的 jdk 版本是,您也不能使用 java 8 中的新功能 lambda 表达式1.8.
至于“targetCompatibility”,表示生成的class文件可以在哪个jre版本上运行,如果设置为1.8,在jdk 1.7上可能无法成功运行,但通常可以在更高版本的jdk上运行。

于 2020-04-07T12:24:11.563 回答
0

这些是 javac 命令的标志。

javac [options] [sourcefiles]

Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...

换句话说:您在一个source版本中编写代码并将您的类编译为targetVM 版本。为了运行它,例如在其他具有较旧 Java 版本的工作站上。

根据:https ://docs.oracle.com/en/java/javase/11/tools/javac.html

于 2020-05-14T11:45:33.550 回答