Gradle,“sourceCompatibility”vs“targetCompatibility”?

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

根据Gradle文档 :

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

我的理解是, targetCompatibility将生成与特定版本的Java兼容的Java字节码,这是sourceCompatibilityfunction的一个子集?

这通过映射到javac – 请参阅交叉编译部分 – 源基本上是源语言级别,目标是生成的字节码的级别。

使用这些时要小心; 我们被假设的人咬了。

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

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

出于这个原因,我总是将兼容性设置与我正在构build的实际Java版本进行比较。 如果他们不匹配,我失败的构build。

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

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

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

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