摇篮,“ sourceCompatibility”与“ targetCompatibility”?


130

sourceCompatibility和之间的关系/差异是targetCompatibility什么?将它们设置为不同的值会怎样?

根据Gradle文档

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

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

Answers:



62

使用时要小心;我们被人们的假设所困扰。

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

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

因此,我总是将Compatibility设置与要构建的实际Java版本进行比较。如果不匹配,我将使构建失败。


4
这是一个微妙但非常重要的观察。
Natix

您如何比较它们?
zero01alpha

为什么您无法通过构建?给出“ bootstrap classpath”选项仅用于缓解此问题。您始终可以使用适当的引导程序,并且应该可以正常工作。
Codebender

6
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())这就是我在build.gradle文件开头立即解决此问题的方法。
Xerus

2
从Java 9开始,现在有一个新的javac选项--release旨在通过仅允许使用指定Java版本中可用的API来解决此问题。有关更多信息,请参见stackoverflow.com/a/43103038/4653517
James Mudd

35

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

默认情况下,sourceCompatibility =“正在使用的当前JVM的版本”,而targetCompatibility = sourceCompatibility

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

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


我们如何确定我们的项目正在使用哪些项目?
isJulian00

0

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


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.