Gradle: 我能控制你能不能編譯運(yùn)行
大家好,我是指北君。
今天帶大家了解一下 Gradle 中 sourceCompatiblity 和 targetCompatibility 的使用配置和區(qū)別。
Java 中的版本處理
在了解 Gradle 中的 sourceCompatiblity 和 targetCompatibility 之前, 我們先來(lái)看看 Java 在編譯的時(shí)候,是怎么處理版本號(hào)的。
當(dāng)我們使用javac編譯一個(gè)Java程序時(shí),我們可以為版本處理提供以下兩個(gè)關(guān)閉版本的編譯選項(xiàng)。
- -source 指的是我們的 Java 代碼的語(yǔ)言版本和編譯的 JDK 相匹配(例如,1.8代表JDK8)。我們所提供的版本值將限制源代碼中使用的語(yǔ)言特性,使其符合各自的Java版本。
- -target 指的是控制生成的類文件的版本。也就是說(shuō)我們提供的版本值將是我們的程序可以運(yùn)行的最低Java版本。
舉個(gè)例子
上面的命令的意思就是 程序的運(yùn)行環(huán)境需要支持JDK 1.8 也就是 Java 8, 而源碼中不能包含 Java 6 以上版本的語(yǔ)言特性,比如說(shuō) Lambda 表達(dá)式等等。
Gradle 中的版本使用
Gradle 中需要依賴Java插件,然后通過(guò)一個(gè)叫 java 的 task 來(lái)配置 sourceCompatibility 和 targetCompatibility 屬性,也就是 javac 中的 -source? 和 -target 編譯選項(xiàng)。
讓我們來(lái)設(shè)置build.gradle文件
通過(guò)一個(gè)例子來(lái)驗(yàn)證一下:
我們創(chuàng)建一個(gè)叫 HelloWorld 的控制臺(tái)程序來(lái)進(jìn)行測(cè)試,創(chuàng)建一個(gè) HelloWorldApp 的 class。
好,我們使用 gradle build 命令來(lái)編譯下,我們可以看到生成了一個(gè) HelloWorldApp.class 的文件。
我們通過(guò)使用 javap 命令行工具來(lái)檢查這個(gè)class 的字節(jié)碼版本號(hào)。
輸出結(jié)果如下:
這里的主版本號(hào)是52,也就是 Java 8 class 文件的版本號(hào)。這就意味著 HelloWorldApp.class 只能運(yùn)行在 JDK 1.8 以上版本。
再來(lái)測(cè)試一下 sourceCompatibility, 我修改一下代碼,增加一個(gè) Java 6 沒(méi)有的特性,比如說(shuō) Lambda 表達(dá)式。
我們嘗試使用 gradle 進(jìn)行編譯, 可以看到有一個(gè)編譯錯(cuò)誤。
-source選項(xiàng)相當(dāng)于Gradle 配置中 sourceCompatibility,可以讓我們的代碼在編譯過(guò)程中提前發(fā)現(xiàn)問(wèn)題,如果我們不想引入更高的版本特性,使用這個(gè)選項(xiàng)可以確保我們不會(huì)誤用這些特性。比如說(shuō)我們可能希望我們的應(yīng)用程序也能在Java 6 runtime 上運(yùn)行。
總結(jié)
在這篇文章中,我們了解如何使用 -source? 和 -target 編譯選項(xiàng)來(lái)處理我們的Java源代碼和目標(biāo)運(yùn)行時(shí)的版本。我們還可以通過(guò)Gradle 的 sourceCompatbility 和 targetCompatibility 配置使用這些編譯選項(xiàng)。





























