Gradle 格雷德尔,“他说;sourceCompatibility“;vs";targetCompatibility“;?

Gradle 格雷德尔,“他说;sourceCompatibility“;vs";targetCompatibility“;?,gradle,java,Gradle,Java,sourceCompatibility和targetCompatibility之间的关系/区别是什么?当它们被设置为不同的值时会发生什么 根据: sourceCompatibility是“编译Java源代码时要使用的Java版本兼容性” targetCompatibility是“为其生成类的Java版本” 我的理解是,targetCompatibility将生成与特定版本的java兼容的java字节码,这是sourceCompatibility功能的一个子集吗?targetCompatibili

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

根据:

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


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

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


更多细节可以在javac中找到。

使用这些工具时要小心;我们已经被那些做出假设的人咬了一口

仅仅因为您使用了1.5版的sourceCompability(或targetCompatibility),并不意味着您总是可以使用JDK1.6编译代码,并期望它在JDK1.5下工作。问题是可用的库

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


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

sourceCompatibility=指定用于编译.Java文件的Java编程语言版本。 e、 g sourceCompatibility 1.6=指定Java编程语言的1.6版用于编译.Java文件

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

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


类文件将在targetCompatibility指定的目标和更高版本上运行,但不会在VM的早期版本上运行。我认为,“sourceCompatibility”是指可以在源代码中使用的功能。例如,如果将sourceCompatibility设置为1.7,那么,即使您的jdk版本是1.8,也不能使用lambda表达式,这是java 8中的一个新特性。

至于“targetCompatibility”,它意味着生成的类文件可以在哪个版本的jre上运行,如果将其设置为1.8,它可能无法在JDK1.7上成功运行,但通常可以在更高版本的jdk上运行。

这些是javac命令的标志

javac [options] [sourcefiles]

Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...
换句话说:您在
源代码
版本中编写代码,并将类编译到
目标
虚拟机版本。以便在其他具有较旧java版本的工作站上运行


根据:

这是一个微妙但非常重要的观察结果。你如何比较它们?为什么构建失败?提供“引导类路径”选项只是为了缓解这个问题。您始终可以使用正确的引导,它应该可以正常工作。
如果(JavaVersion.current()!=JavaVersion.VERSION\u 1\u 8)抛出新的GradleException(“此项目需要Java 8,但它在”+JavaVersion.current()上运行”)
我就是这样解决这个问题的,就在build.gradle文件的开头。自Java 9以来,现在有一个新的
javac
选项
--release
,旨在通过只允许使用指定Java版本中可用的API来解决此问题。有关这方面的更多信息,请参见如何确定我们的项目正在使用哪些工具?上面的链接指向DocforJava7。我想知道你是否想要像这样的东西?