概述

本文将探讨Java配置中的sourceCompatibilitytargetCompatibility之间的差异,以及它们在Gradle中的使用。要了解更多关于Gradle的基础知识,请参考我们的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任务的sourceCompatibilitytargetCompatibility配置设置sourcetarget选项。同样,我们使用与javac相同的值

让我们设置build.gradle文件:

plugins {
    id 'java'
}

group 'com.baeldung'

java {
    sourceCompatibility = "1.6"
    targetCompatibility = "1.8"
}

4. 示例:HelloWorldApp编译

我们可以创建一个简单的控制台应用程序,并使用上述脚本构建它来演示功能。

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

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.baeldung.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选项,它是Gradle配置sourceCompatibility的Java等效项,阻止了我们的代码编译。基本上,它防止我们在无意中使用更高版本的功能,例如,我们可能希望我们的应用也能在Java 6运行时环境中运行。

5. 总结

本文解释了如何使用-source-target编译选项来处理Java源代码和目标运行时的版本。我们还了解了这些选项如何映射到Gradle的sourceCompatbilitytargetCompatibility配置,以及它们在实践中是如何工作的。

如往常一样,本文的源代码可在GitHub上获取。