java sourceCompatibility和targetCompatibility有什么区别?

o2g1uqev  于 2023-06-20  发布在  Java
关注(0)|答案(6)|浏览(221)

sourceCompatibilitytargetCompatibility有什么区别?当它们被设置为不同的值时会发生什么?
根据Java plugin Gradle文档的工具链和兼容性部分:

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

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

wyyhbhjk

wyyhbhjk1#

targetCompatibilitysourceCompatibilityMap到javac中的-target release-source release。源基本上是源语言级别,目标是生成的字节码级别。
更多细节可以在 Tools Referencefor Java 8的 *Cross-Compilation Options for javac * 部分找到,适用于Java 11、for Java 17for Java 19

rur96b6h

rur96b6h2#

当你使用这些的时候要小心;我们一直被人们的假设所困扰
仅仅因为您使用1.5的sourceCompability(或targetCompatibility)并不意味着您总是可以使用JDK 1.6编译代码并期望它在JDK 1.5下工作。问题是可用的库。
如果您的代码碰巧调用了一些仅在JDK 1.6中可用的方法,它仍然会使用目标VM的各种兼容性选项进行编译。但是当您运行它时,它会失败,因为违规方法不存在(您将获得MethodNotFoundException或ClassNotFoundException)。
出于这个原因,我总是将Compatibility设置与我正在构建的实际Java版本进行比较。如果它们不匹配,则构建失败。

lsmepo6l

lsmepo6l3#

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

  • 默认情况下,sourceCompatibility =“当前使用的JVM版本”,targetCompatibility = sourceCompatibility*
    targetCompatibility=该选项确保生成的类文件与targetCompatibility指定的VM兼容。请注意,在大多数情况下,-target选项的值是-source选项的值;在这种情况下,可以省略-target选项。
  • 类文件将在targetCompatibility指定的目标和更高版本上运行,但不会在VM的早期版本上运行 *
dxpyg8gm

dxpyg8gm4#

关于sourceCompatibilitytargetCompatibility的优点,已经有很多很好的解释,在Gradle: sourceCompatiblity vs targetCompatibility可以找到更好的文章。但是,我建议使用Gradle toolchain(参见Toolchains for JVM projects),而不是sourceCompatibilitytargetCompatibility,它使releasesourceCompatibility调整过时,并保证语言功能(sourceCompatibility),字节码(targetCompatibility)和Java-API/-Libraries(release)将匹配Java版本。(唯一的缺点是IDE支持尚未完全建立,但正在进行中)。

fhg3lkii

fhg3lkii5#

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

zbq4xfa0

zbq4xfa06#

这些是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

相关问题