Gradle,“sourceCompatibility”与“targetCompatibility”?

时间:2013-05-20 17:31:24

标签: gradle java

sourceCompatibilitytargetCompatibility之间的关系/区别是什么?将它们设置为不同的值会发生什么?

根据Gradle documentation

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

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

5 个答案:

答案 0 :(得分:65)

这映射到javac - 请参阅the cross compilation section - source基本上是源语言级别,target是生成的字节码级别。

答案 1 :(得分:48)

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

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

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

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

答案 2 :(得分:27)

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

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分: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版本编写代码,并将类编译为target VM版本。为了运行它例如在其他Java版本较旧的工作站上。

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