Gradle 筆記—Java構建入門
來自: http://www.uml.org.cn/jchgj/201603022.asp
Gradle是一個通用的構建工具,通過它的構建腳本你可以構建任何你想要實現的東西,不過前提是你需要先寫好構建腳本的代碼。而大部分的項目,它們的構建流程基本是一樣的,我們不必為每一個工程都編寫它的構建代碼,因為Gradle已經為我們提供了相應的插件。Gradle 本身自帶了許多插件,而對于Gradle沒有的插件,可以去github上看看有沒有其他人實現,或自己實現。對Java項目而言,Gradle有Java插件,提供了像編譯、測試、打包之類的功能。
這里簡單介紹一下Java插件。
Java插件為構建項目定義了許多的默認設置,像源文件目錄,編譯后的文件存放位置等等。如果你是按著默認的規則來的,那么構建腳本將會很簡單。當然,如果項目結構不一樣,也可以自己指定這些規則。這里暫不介紹,只說一下基本的用法。
1. 使用Java插件
只需要要構建腳本中添加以下代碼:
apply plugin: 'java'
定義一個Java項目只需要添加這么一句代碼,它會為你添加Java插件,以及一些內置任務。
默認情況下,Gradle會在src/main/java中查找你的源碼,在src/test/java中查找你的測試代碼,而src/main/resources下的文件都會被打包,src/test/resources下的文件會被包含在classpath中用于測試。所有輸出的文件都保存在build目錄里,而生成的jar包則是在build/libs里面。
2. 構建項目
Java插件幫你定義了許多任務,這個可以通過前面說的gradle tasks命令來看。當執行gradle build 時,Gradle會執行編譯,測試,并且將源文件和資源文件打成jar包。
除了build之外,還有幾個常用的任務,如下:
clean:刪除build目錄和其他構建時生成的文件。
assemble:編譯并打包,但不執行單元測試。不過一些其他插件可能會增強這個任務,例如 War 插件會再打出war包。
check:編譯并測試代碼。其他插件可能會增強這個任務。比如 Code-quality 插件會讓這個任務去執行Checkstyle。
3. 外部依賴
通常一個項目會有許多外部依賴,我們需要在構建腳本中告訴Gradle在哪里可以找到這些依賴。比如如果使用maven中央倉庫的話,我們可以通過以下代碼來添加倉庫:
repositories { mavenCentral() }
然后再通過下面代碼添加依賴:
dependencies { compile group: 'commons-collections', name: 'commons-collections', version: '3.2' testCompile group: 'junit', name: 'junit', version: '4.+' }
上面的代碼中,聲明了在編譯期,需要依賴 commons-collections,在測試期需要依賴 junit。關于依賴的內容,下一篇會有更詳細的筆記。
4. 自定義項目
前面提到,Java插件為項目定義了許多默認配置,如果我們需要,這些配置都是可以由我們自己來定義的。如下面例子,指定項目版本號和JDK版本號,并且添加一些屬性到JAR包的manifest文件中:
sourceCompatibility = 1.5 version = '1.0' jar { manifest { attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version } }
Java插件添加的都是普通任務,所以前面一章介紹的Gradle機制也可以用在這里,比如修改任務的依賴,添加任務行為,甚至重寫某個任務等等。下面的例子是修改test任務來添加系統屬性:
test { systemProperties 'property': 'value' }
5. 發布JAR包
以下代碼是發布JAR包到本地中。發布到maven倉庫或jcenter倉庫以后再討論。
uploadArchives { repositories { flatDir { dirs 'repos' } } }
執行gradle uploadArchives即可發布該JAR包。
6. 創建Eclipse項目
如果想把項目導入到eclipse當中,需要使用一個Eclipse插件:
apply plugin: 'eclipse'
執行gradle eclipse會生成eclipse項目文件,關于此插件以后再細說。
7. 小結
下面是一個完整的Java項目構建腳本:
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' } } }
8. 多項目構建
項目結構:
multiproject/ api/ services/webservice/ shared/
首先需要創建一個settings.gradle的配置文件,來聲明構建要包含哪些項目。文件的內容如下:
include "shared", "api", "services:webservice", "services:shared"
多項目構建,以后會詳談。
9. 公共配置
對多項目構建當中,會有一些配置是共同的。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' } }
上面的配置就會子項目都應用了java和eclipse-wtp插件,聲明了maven中央倉庫,添加了測試期的依賴junit,以及定義了項目版本包和打成的jar包里的manifest文件的屬性。
10. 項目依賴
同一個構建中的項目可以建立項目依賴。比如api子項目要依賴share子項目生成的jar包,那么在api子項目的構建腳本中可以使用以下代碼:
dependencies { compile project(':shared') }
11. 多項目的打包發布
task dist(type: Zip) { dependsOn spiJar from 'src/dist' into('libs') { from spiJar.archivePath from configurations.runtime } } artifacts { archives dist }
這段代碼我還沒能理解。先記著。