Gradle: 我能控制你能不能编译运行

开发 前端
在这篇文章中,我们了解如何使用 -source​ 和 -target 编译选项来处理我们的Java源代码和目标运行时的版本。我们还可以通过Gradle 的 sourceCompatbility 和 targetCompatibility 配置使用这些编译选项。

大家好,我是指北君。

今天带大家了解一下 Gradle 中 sourceCompatiblity 和 targetCompatibility 的使用配置和区别。

Java 中的版本处理

在了解 Gradle 中的 sourceCompatiblity 和 targetCompatibility 之前, 我们先来看看 Java 在编译的时候,是怎么处理版本号的。

当我们使用javac编译一个Java程序时,我们可以为版本处理提供以下两个关闭版本的编译选项。

  • -source 指的是我们的 Java 代码的语言版本和编译的 JDK 相匹配(例如,1.8代表JDK8)。我们所提供的版本值将限制源代码中使用的语言特性,使其符合各自的Java版本。
  • -target 指的是控制生成的类文件的版本。也就是说我们提供的版本值将是我们的程序可以运行的最低Java版本。

举个例子

javac HelloWorld.java -source 1.6 -target 1.8

上面的命令的意思就是 程序的运行环境需要支持JDK 1.8 也就是 Java 8, 而源码中不能包含 Java 6 以上版本的语言特性,比如说 Lambda 表达式等等。

Gradle 中的版本使用

Gradle 中需要依赖Java插件,然后通过一个叫 java 的 task 来配置 sourceCompatibility 和 targetCompatibility 属性,也就是 javac 中的 -source​ 和 -target 编译选项。

让我们来设置build.gradle文件

plugins {
id 'java'
}

group 'cn.javanorth'

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

通过一个例子来验证一下:

我们创建一个叫 HelloWorld 的控制台程序来进行测试,创建一个 HelloWorldApp 的 class。

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

好,我们使用 gradle build 命令来编译下,我们可以看到生成了一个 HelloWorldApp.class 的文件。

我们通过使用 javap 命令行工具来检查这个class 的字节码版本号。

javap -verbose HelloWorldApp.class

输出结果如下:

public class cn.javanorth.helloworld.HelloWorldApp
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER

这里的主版本号是52,也就是 Java 8 class 文件的版本号。这就意味着 HelloWorldApp.class 只能运行在 JDK 1.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 6 runtime 上运行。

总结

在这篇文章中,我们了解如何使用 -source​ 和 -target 编译选项来处理我们的Java源代码和目标运行时的版本。我们还可以通过Gradle 的 sourceCompatbility 和 targetCompatibility 配置使用这些编译选项。

责任编辑:武晓燕 来源: Java技术指北
相关推荐

2013-04-19 10:42:02

打车软件大数据

2019-11-21 09:25:23

AI 数据人工智能

2020-12-03 07:39:50

HashMap底层数据

2021-05-18 12:35:00

Divdom产品经理

2016-05-19 17:10:27

银行

2021-02-26 21:25:08

比特币投资货币

2022-10-20 08:00:37

机器人ZadigChatOps

2020-10-16 18:33:18

Rust语言前端开发

2022-04-24 11:52:04

元宇宙Web3去中心化

2023-04-06 06:55:24

ChatGPTGPT算力

2012-06-13 11:01:59

英特尔

2020-12-21 15:09:23

人工智能安全人脸识别

2023-12-27 08:03:53

Go优化代码

2010-04-13 10:02:16

索引

2011-12-06 10:06:33

云存储

2021-06-15 11:33:48

监控微信聊天前端

2022-11-07 08:36:11

2011-08-09 16:08:53

数据库连接

2018-03-05 07:38:11

2012-05-09 09:55:17

LINQ
点赞
收藏

51CTO技术栈公众号