Contents

Gradle 的sourceCompatbility和targetCompatibility配置

1. 概述

在本文中,我们将了解sourceCompatbilitytargetCompatibility** Java 配置之间的区别以及它们在 Gradle 中的用法。

您可以查看我们v Gradle 简介 文章以了解有关基础知识的更多信息。

2. 在 Java 中处理版本

当我们使用javac编译 Java 程序时 ,我们可以为版本处理提供编译选项。有两种选择:

  • -source的值与 Java 版本匹配,直到我们用于编译的 JDK(例如,JDK8 为 1.8)。我们提供的版本值会将我们可以在源代码中使用的语言功能限制在其各自的 Java 版本中。
  • -target 类似,但控制生成的类文件的版本。这意味着我们提供的版本值将是 我们的程序可以运行的最低 Java 版本

例如:

javac HelloWorld.java -source 1.6 -target 1.8

这将生成一个需要 Java 8 或更高版本才能运行的类文件。此外,源代码不能包含 lambda 表达式或 Java 6 中不可用的任何功能

3. 使用 Gradle 处理版本

Gradle 和 Java 插件一起让我们使用java任务的sourceCompatibility和 targetCompatibility配置来设置source和 target选项 。同样,我们使用与javac相同的值。

让我们设置build.gradle文件:

plugins {
    id 'java'
}
group 'com.blogdemo'
java {
    sourceCompatibility = "1.6"
    targetCompatibility = "1.8"
}

4. HelloWorldApp示例编译

我们可以创建一个Hello World!控制台应用程序并通过使用上述脚本构建它来演示功能。

让我们创建一个非常简单的类:

public class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

当我们使用gradle build命令构建它时,Gradle 将生成一个名为HelloWorldApp.class的类文件。

我们可以使用Java自带的 javap命令行工具来检查这个类文件生成的字节码版本:

javap -verbose HelloWorldApp.class

这打印了很多信息,但在前几行中,我们可以看到:

public class com.blogdemo.helloworld.HelloWorldApp
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER

major version字段的 值为 52,它是 Java 8 类文件的版本号。这意味着我们的HelloWorldApp.class只能使用 Java 8 及更高版本运行

要测试sourceCompatibility配置,我们可以更改源代码并引入 Java 6 中不可用的功能。

让我们使用 lambda 表达式:

public class HelloWorldApp {
    public static void main(String[] args) {
        Runnable helloLambda = () -> {
            System.out.println("Hello World!");
        }
        helloLambda.run();
    }
}

如果我们尝试使用 Gradle 构建代码,我们会看到一个编译错误:

error: lambda expressions are not supported in -source 1.6

-source选项是sourceCompatibility Gradle 配置的 Java 等效项,可防止我们的代码编译。基本上,如果我们不想引入更高版本的功能,它可以防止我们错误地使用它们——例如,我们可能希望我们的应用程序也能够在 Java 6 运行时上运行。