概述
本文将探讨Java配置中的sourceCompatibility
和targetCompatibility
之间的差异,以及它们在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
任务的sourceCompatibility
和targetCompatibility
配置设置source
和target
选项。同样,我们使用与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的sourceCompatbility
和targetCompatibility
配置,以及它们在实践中是如何工作的。
如往常一样,本文的源代码可在GitHub上获取。