【问题标题】:Gradle, "sourceCompatibility" vs "targetCompatibility"?Gradle,“sourceCompatibility”与“targetCompatibility”?
【发布时间】:2013-05-15 07:57:38
【问题描述】:

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

根据Gradle documentation

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

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

【问题讨论】:

    标签: gradle java


    【解决方案1】:

    targetCompatibilitysourceCompatibility 映射到 javac 中的 -target release-source release。 Source 基本上是源语言级别,而 target 是生成的字节码级别。

    更多细节可以在javacthe cross compilation section中找到。

    【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这是一个微妙但非常重要的观察结果。
    • 你如何比较它们?
    • 为什么构建失败? “引导类路径”选项仅用于缓解此问题。您始终可以使用正确的引导程序,它应该可以正常工作。
    • if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current()) 我就是这样解决这个问题的,就在 build.gradle 文件的开头。
    • 从 Java 9 开始,现在有一个新的 javac 选项 --release 旨在解决这个问题,只允许使用指定 Java 版本中可用的 API。有关更多信息,请参阅stackoverflow.com/a/43103038/4653517
    【解决方案3】:

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

    默认 sourceCompatibility = "当前使用的 JVM 版本" 和 targetCompatibility = sourceCompatibility

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

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

    【讨论】:

    • 我们如何确定我们的项目正在使用哪些?
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2018-08-30
        • 1970-01-01
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        • 2014-01-28
        • 2018-05-28
        • 1970-01-01
        • 2017-06-29
        相关资源
        最近更新 更多