上一節(jié)我們簡要介紹了如何編寫一個單機的To Do應用,接下來要打包部署成可執(zhí)行的應用,我們需要編譯源代碼,生成的class文件需要打包到JAR文件中。JDK提供了javac 和jar工具幫助你實現(xiàn)這些任務,但是你也不想每次源代碼發(fā)生變化時你都手動去執(zhí)行這些任務吧。
Gradle插件能夠自動化完成這些任務,插件引入了一些領域特有的觀念,其中一個Gradle插件就是java插件,Java插件不僅僅只有編譯和打包的功能,它給你的項目安排了一個標準布局,并確保你所有的任務都是按序執(zhí)行,現(xiàn)在該應用java插件來構建你的build腳本了。
每個Gradle項目都會創(chuàng)建一個build.gradle文件,如果你想使用java插件只需要添加下面這行代碼:
apply plugin: 'java'
這一行代碼足以構建你的項目,但是Gradle怎么知道你的源代碼放在哪個位置呢?java插件的一個約定就是源代碼的位置,默認情況下插件搜索src/main/java路徑下的文件,你的包名com.manning.gia.todo會轉換成源代碼根目錄下的子目錄,創(chuàng)建build腳本之后你的項目結構應該是這樣的:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag12.png" alt="" />
現(xiàn)在你可以構建你的項目了,java插件添加了一個build任務到你項目中,build任務編譯你的代碼、運行測試然后打包成jar文件,所有都是按序執(zhí)行的。運行gradle build之后你的輸出應該是類似這樣的:
$ gradle build
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build
輸出的每一行都表示一個可執(zhí)行的任務,你可能注意到有一些任務標記為UP_TO-DATE,這意味著這些任務被跳過了,gradle能夠自動檢查哪些部分沒有發(fā)生改變,就把這部分標記下來,省的重復執(zhí)行。在大型的企業(yè)項目中可以節(jié)省不少時間。執(zhí)行完gradle build之后項目結構應該是類似這樣的:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag13.png" alt="" /> http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag14.png" alt="" />
在項目的根目錄你可以找到一個build目錄,這里包含了所有的輸出,包含class文件,測試報告,打包的jar文件,以及一些用來歸檔的臨時文件。如果你之前使用過maven,它的標準輸出是target,這兩個結構應該很類似。jar文件目錄build/libs下可以直接運行,jar文件的名稱直接由項目名稱得來的,這里是todo-app。
你只需要使用JDK的java命令就可以執(zhí)行這個應用了:
$ java -cp build/classes/main com.manning.gia.todo.ToDoApp
--- To Do Application ---
Please make a choice:
(a)ll items
(f)ind a specific item
(i)nsert a new item
(u)pdate an existing item
(d)elete an existing item
(e)xit
>
接下來我們會學習如何自定義項目結構。
Java插件是一個非常固執(zhí)的框架,對于項目很多的方面它都假定有默認值,比如項目布局,如果你看待世界的方法是不一樣的,Gradle給你提供了一個自定義約定的選項。想知道哪些東西是可以配置的?可以參考這個手冊:http://www.gradle.org/docs/current/dsl/,之前提到過,運行命令行gradle properties可以列出可配置的標準和插件屬性以及他們的默認值。
修改你的項目和插件屬性
接下來你將學習如何指定項目的版本號、Java源代碼的兼容級別,前面你用的java命令來運行應用程序,你需要通過命令行選項-cp build/classes/main指定class文件的位置給Java運行時。但是要從JAR文件中啟動應用,你需要在manifest文件MANIFEST.MF中包含首部Main-Class??聪旅娴哪_本你就明白怎么操作了:
//Identifies project’sversion through a number scheme
version = 0.1
//Sets Java version compilation compatibility to 1.6
sourceCompatibility = 1.6
//Adds Main-Class header to JAR file’s manifest
jar {
manifest {
attributes 'Main-Class': 'com.manning.gia.todo.ToDoApp'
}
}
打包成JAR之后,你會發(fā)現(xiàn)JAR文件的名稱變成了todo-app-0.1.jar,這個jar包含了main-class首部,你就可以通過命令java -jar build/libs/todo-app-0.1.jar運行了。
接下來學習如何改變項目的默認布局:
//Replaces conventional source code directory with list of different directories
sourceSets {
main {
java {
srcDirs = ['src']
}
}
//Replaces conventional test source code directory with list of different directories
test {
java {
srcDirs = ['test']
}
}
}
//Changes project output property to directory out
buildDir = 'out'
配置和使用外部依賴
在Java世界里,依賴是分布的以JAR文件的形式存在,許多庫都從倉庫里獲得,比如一個文件系統(tǒng)或中央服務器。Gradle需要你指定至少一個倉庫作為依賴下載的地方,比如mavenCentral: //Shortcut notation for configuring Maven Central 2 repository accessible under http://repo1.maven.org/maven2
repositories {
mavenCentral()
}
定義依賴
接下來就是定義依賴,依賴通過group標識,name和version來確定,比如下面這個:
dependencies {
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.1'
}
Gradle是通過配置來給依賴分組,Java插件引入的一個配置是compile,你可以很容易區(qū)分這個配置定義的依賴是用來編譯源代碼的。
解析依賴
Gradle能夠自動檢測并下載項目定義的依賴:
$ gradle build
:compileJava
Download http://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.pom
Download http://repo1.maven.org/maven2/org/apache/commons/commons-parent/22/commons-parent-22.pom
Download http://repo1.maven.org/maven2/org/apache/apache/9/apache-9.pom
Download http://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar
:processResources UP-TO-DATE
...
:build