如你所見,Gradle 是一個(gè)通用工具。它可以通過腳本構(gòu)建任何你想要實(shí)現(xiàn)的東西,真正實(shí)現(xiàn)開箱即用。但前提是你需要在腳本中編寫好代碼才行。
大部分 Java 項(xiàng)目基本流程都是相似的:編譯源文件,進(jìn)行單元測試,創(chuàng)建 jar 包。使用 Gradle 做這些工作不必為每個(gè)工程都編寫代碼。Gradle 已經(jīng)提供了完美的插件來解決這些問題。插件就是 Gradle 的擴(kuò)展,簡而言之就是為你添加一些非常有用的默認(rèn)配置。Gradle 自帶了很多插件,并且你也可以很容易的編寫和分享自己的插件。Java plugin 作為其中之一,為你提供了諸如編譯,測試,打包等一些功能。
Java 插件為工程定義了許多默認(rèn)值,如Java源文件位置。如果你遵循這些默認(rèn)規(guī)則,那么你無需在你的腳本文件中書寫太多代碼。當(dāng)然,Gradle 也允許你自定義項(xiàng)目中的一些規(guī)則,實(shí)際上,由于對 Java 工程的構(gòu)建是基于插件的,那么你也可以完全不用插件自己編寫代碼來進(jìn)行構(gòu)建。
后面的章節(jié)我們通過許多深入的例子介紹了如何使用 Java 插件來進(jìn)行以來管理和多項(xiàng)目構(gòu)建等。但在這個(gè)章節(jié)我們需要先了解 Java 插件的基本用法。
來看一下下面這個(gè)小例子,想用 Java 插件,只需增加如下代碼到你的腳本里。
build.gradle
apply plugin: 'java'
備注:示例代碼可以在 Gralde 發(fā)行包中的 samples/java/quickstart 下找到。
定義一個(gè) Java 項(xiàng)目只需如此而已。這將會(huì)為你添加 Java 插件及其一些內(nèi)置任務(wù)。
添加了哪些任務(wù)?
你可以運(yùn)行 gradle tasks 列出任務(wù)列表。這樣便可以看到 Java 插件為你添加了哪些任務(wù)。
標(biāo)準(zhǔn)目錄結(jié)構(gòu)如下:
project
+build
+src/main/java
+src/main/resources
+src/test/java
+src/test/resources
Gradle 默認(rèn)會(huì)從 src/main/java
搜尋打包源碼,在 src/test/java
下搜尋測試源碼。并且 src/main/resources
下的所有文件按都會(huì)被打包,所有 src/test/resources
下的文件 都會(huì)被添加到類路徑用以執(zhí)行測試。所有文件都輸出到 build 下,打包的文件輸出到 build/libs 下。
Java 插件為你添加了眾多任務(wù)。但是它們只是在你需要構(gòu)建項(xiàng)目的時(shí)候才能發(fā)揮作用。最常用的就是 build 任務(wù),這會(huì)構(gòu)建整個(gè)項(xiàng)目。當(dāng)你執(zhí)行 gradle build 時(shí),Gralde 會(huì)編譯并執(zhí)行單元測試,并且將 src/main/*
下面 class 和資源文件打包。
運(yùn)行 gradle build 的輸出結(jié)果
Output of gradle build
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 1 secs
其余一些較常用的任務(wù)有如下幾個(gè):
刪除 build 目錄以及所有構(gòu)建完成的文件。
編譯并打包 jar 文件,但不會(huì)執(zhí)行單元測試。一些其他插件可能會(huì)增強(qiáng)這個(gè)任務(wù)的功能。例如,如果采用了 War 插件,這個(gè)任務(wù)便會(huì)為你的項(xiàng)目打出 War 包。
編譯并測試代碼。一些其他插件也可能會(huì)增強(qiáng)這個(gè)任務(wù)的功能。例如,如果采用了 Code-quality 插件,這個(gè)任務(wù)會(huì)額外執(zhí)行 Checkstyle。
通常,一個(gè) Java 項(xiàng)目擁有許多外部依賴。你需要告訴 Gradle 如何找到并引用這些外部文件。在 Gradle 中通常 Jar 包都存在于倉庫中。倉庫可以用來搜尋依賴或發(fā)布項(xiàng)目產(chǎn)物。下面是一個(gè)采用 Maven 倉庫的例子。
build.gradle
repositories {
mavenCentral()
}
添加依賴。這里聲明了編譯期所需依賴 commons-collections 和測試期所需依賴 junit。
build.gradle
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
了解更多可參閱依賴管理基礎(chǔ)
Java 插件為你的項(xiàng)目添加了眾多默認(rèn)配置。這些默認(rèn)值通常對于一個(gè)普通項(xiàng)目來說已經(jīng)足夠了。但如果你覺得不適用修改起來也很簡單??聪旅娴睦?,我們?yōu)?Java 項(xiàng)目指定了版本號(hào)以及所用的 JDK 版本,并且添加一些屬性到 mainfest 中。
build.gradle
sourceCompatibility = 1.5
version = '1.0'
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
}
}
都有哪些可用屬性?
可以執(zhí)行 gradle propertie s來得到項(xiàng)目的屬性列表。用這條命令可以看到插件添加的屬性以及默認(rèn)值。
Java 插件添加的都是一些普通任務(wù),如同他們寫在 Build 文件中一樣。這意味著前面章節(jié)展示的機(jī)制都可以用來修改這些任務(wù)的行為。例如,可以設(shè)置任務(wù)的屬性,添加任務(wù)行為,更改任務(wù)依賴,甚至是重寫覆蓋整個(gè)任務(wù)。在下面的例子中,我們將修改 test 任務(wù),這是一個(gè) Test 類型任務(wù)。讓我們來在它執(zhí)行時(shí)為它添加一些系統(tǒng)屬性。
build.gradle
test {
systemProperties 'property': 'value'
}
如何發(fā)布 jar 包?你需要告訴 Gradle 發(fā)布到到哪。在 Gradle 中 jar 包通常被發(fā)布到某個(gè)倉庫中。在下面的例子中,我們會(huì)將 jar 包發(fā)布到本地目錄。當(dāng)然你也可以發(fā)布到遠(yuǎn)程倉庫或多個(gè)遠(yuǎn)程倉庫中。
build.gradle
uploadArchives {
repositories {
flatDir {
dirs 'repos'
}
}
}
執(zhí)行 gradle uploadArchives 以發(fā)布 jar 包。
若要把項(xiàng)目導(dǎo)入 Eclipse 中,你需要添加另外一個(gè)插件到你的腳本文件中。
build.gradle
apply plugin: 'eclipse'
執(zhí)行 gradle eclipse 來生成 Eclipse 項(xiàng)目文件。
這是示例代碼匯總得到的一個(gè)完整腳本:
build.gradle
apply plugin: 'java'
apply plugin: 'eclipse'
sourceCompatibility = 1.5
version = '1.0'
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
}
}
repositories {
mavenCentral()
}
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
test {
systemProperties 'property': 'value'
}
uploadArchives {
repositories {
flatDir {
dirs 'repos'
}
}
}
現(xiàn)在來看一個(gè)典型的多項(xiàng)目構(gòu)建的例子。項(xiàng)目結(jié)構(gòu)如下:
Build layout
multiproject/
api/
services/webservice/
shared/
備注: 本示例代碼可在 Gradle 發(fā)行包的 samples/java/multiproject 位置找到
此處有三個(gè)工程。api 工程用來生成給客戶端用的 jar 文件,這個(gè) jar 文件可以為 XML webservice 提供 Java 客戶端。webservice 是一個(gè) web 應(yīng)用,生成 XML。shared 工程包含的是前述兩個(gè)工程共用的代碼。
定義一個(gè)多項(xiàng)目構(gòu)建工程需要在根目錄(本例中與 multiproject 同級(jí))創(chuàng)建一個(gè)setting 配置文件來指明構(gòu)建包含哪些項(xiàng)目。并且這個(gè)文件必需叫 settings.gradle 本例的配置文件如下:
settings.gradle
include "shared", "api", "services:webservice", "services:shared"
對多項(xiàng)目構(gòu)建而言,總有一些共同的配置.在本例中,我們會(huì)在根項(xiàng)目上采用配置注入的方式定義一些公共配置。根項(xiàng)目就像一個(gè)容器,子項(xiàng)目會(huì)迭代訪問它的配置并注入到自己的配置中。這樣我們就可以簡單的為所有工程定義主配置單了:
build.gradle
subprojects {
apply plugin: 'java'
apply plugin: 'eclipse-wtp'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.11'
}
version = '1.0'
jar {
manifest.attributes provider: 'gradle'
}
}
值得注意的是我們?yōu)槊總€(gè)子項(xiàng)目都應(yīng)用了 Java 插件。這意味著我們在前面章節(jié)學(xué)習(xí)的內(nèi)容在子項(xiàng)目中也都是可用的。所以你可以在根項(xiàng)目目錄進(jìn)行編譯,測試,打包等所有操作。
同一個(gè)構(gòu)建中可以建立工程依賴,一個(gè)工程的 jar 包可以提供給另外一個(gè)工程使用。例如我們可以讓 api 工程以依賴于 shared 工程的 jar 包。這樣 Gradle 在構(gòu)建 api 之前總是會(huì)先構(gòu)建 shared 工程。
api/build.gradle
dependencies {
compile project(':shared')
}
如何發(fā)布,請看下文:
api/build.gradle
task dist(type: Zip) {
dependsOn spiJar
from 'src/dist'
into('libs') {
from spiJar.archivePath
from configurations.runtime
}
}
artifacts {
archives dist
}
本章中,我們了解了如何構(gòu)建一個(gè)基本 Java 工程。但這都是一小部分基礎(chǔ),用 Gradle 還可以做很多事。關(guān)于 了解更多可參閱 Java 插件,The Java Plugin,并且你可以在 Gradle 發(fā)行包中的 samples/java 目錄找到更多例子。
另外,不要忘了繼續(xù)閱讀依賴管理基礎(chǔ)內(nèi)容
更多建議: