sourceCompatibility
和targetCompatibility
有什么区别?当它们被设置为不同的值时会发生什么?
根据Java plugin Gradle文档的工具链和兼容性部分:
sourceCompatibility
是“编译Java源代码时使用的Java版本兼容性”。targetCompatibility
是“生成类的Java版本”。
我的理解是,targetCompatibility
将生成与特定Java版本兼容的Java字节码。这是sourceCompatibility
功能的子集吗?
6条答案
按热度按时间wyyhbhjk1#
targetCompatibility
和sourceCompatibility
Map到javac中的-target release
和-source release
。源基本上是源语言级别,目标是生成的字节码级别。更多细节可以在 Tools Referencefor Java 8的 *Cross-Compilation Options for
javac
* 部分找到,适用于Java 11、for Java 17或for Java 19。rur96b6h2#
当你使用这些的时候要小心;我们一直被人们的假设所困扰
仅仅因为您使用1.5的sourceCompability(或targetCompatibility)并不意味着您总是可以使用JDK 1.6编译代码并期望它在JDK 1.5下工作。问题是可用的库。
如果您的代码碰巧调用了一些仅在JDK 1.6中可用的方法,它仍然会使用目标VM的各种兼容性选项进行编译。但是当您运行它时,它会失败,因为违规方法不存在(您将获得MethodNotFoundException或ClassNotFoundException)。
出于这个原因,我总是将Compatibility设置与我正在构建的实际Java版本进行比较。如果它们不匹配,则构建失败。
lsmepo6l3#
sourceCompatibility=指定用于编译**.java文件的Java编程语言版本。例如sourceCompatibility 1.6 =指定使用Java编程语言的1.6版本来编译.java**文件。
targetCompatibility=该选项确保生成的类文件与targetCompatibility指定的VM兼容。请注意,在大多数情况下,-target选项的值是-source选项的值;在这种情况下,可以省略-target选项。
dxpyg8gm4#
关于
sourceCompatibility
与targetCompatibility
的优点,已经有很多很好的解释,在Gradle: sourceCompatiblity vs targetCompatibility可以找到更好的文章。但是,我建议使用Gradletoolchain
(参见Toolchains for JVM projects),而不是sourceCompatibility
与targetCompatibility
,它使release
或sourceCompatibility
调整过时,并保证语言功能(sourceCompatibility
),字节码(targetCompatibility
)和Java-API/-Libraries(release
)将匹配Java版本。(唯一的缺点是IDE支持尚未完全建立,但正在进行中)。fhg3lkii5#
在我看来,“sourceCompatibility”意味着你可以在你的源代码中使用什么功能。例如,如果你将sourceCompatibility设置为1.7,那么即使你的jdk版本是1.8,你也不能使用java 8中的新功能lambda表达式。
至于“targetCompatibility”,表示生成的类文件可以在哪个版本的jre上运行,如果设置为1.8,可能在jdk 1.7上运行不成功,但通常可以在更高版本的jdk上运行。
zbq4xfa06#
这些是javac命令的标志。
换句话说:您可以在
source
版本中编写代码,并将类编译为target
VM版本。为了运行它,例如在其他工作站上使用较旧的Java版本。根据:https://docs.oracle.com/en/java/javase/11/tools/javac.html