使用Gradle構建Java項目
這個指南將指導你如何使用Gradle構建一個簡單的Java項目
你將構建什麼
你將創建一個簡單應用,而且你是用Gradle創建它。
你需要什麼
- 大約15分鐘
- 一個你喜愛的文本編輯器或者IDE
- JDK 6 或者更新
怎麼完整走完這個指南
就像很多Spring入門指南,你可以從零開始,一步一個腳印實現,或者你可以跳過你熟悉的步驟,不管怎麼樣,你最後會得到可以工作的代碼。
移步到<ins style="box-sizing: border-box;">設置項目</ins>,從頭開始
做以下步驟以跳過基本教程:
- <ins style="box-sizing: border-box;">下載</ins>並且解壓本指南的源代碼倉庫,或者使用Git克隆
git clone https://github.com/spring-guides/gs-gradle.git
- cd進入
gs-gradle/initial
- 跳到 Install Gradle
當你完成上面的步驟,你可以那你得到的結果與
gs-gradle/complete
裏的代碼對比。
設置項目
首先,爲Gradle設置一個java項目來構建。爲了把焦點放在Gradle,我們儘可能地把項目做得簡單。
創建目錄結構
在一個你選擇的項目目錄,創建以下子目錄機構;例如,再類unix系統運行
mkdir -p src/main/java/hello
在 src/main/java/hello 目錄裏,你可以創建任何你想要的Java類。爲了簡單的緣故和爲了與指南的一系列操作保持一致性,Spring推薦你創建兩個類:<mark style="box-sizing: border-box;">HelloWorld.java</mark> 和 <mark style="box-sizing: border-box;">Greeter.java.</mark>
<mark style="box-sizing: border-box;">src/main/java/hello/HelloWorld.java</mark>
package hello;
public class HelloWorld {
public static void main(String[] args) {
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
<mark style="box-sizing: border-box;">src/main/java/hello/Greeter.java</mark>
package hello;
public class Greeter {
public String sayHello() {
return "Hello world!";
}
}
安裝Gradle
既然現在你有了一個你能使用Gradle構建的項目,那麼你可以安裝Gradle 使用安裝器是非常推薦的:
- SDKMAN
- Homebrew
如果以上工具都不適用於你的情況,你可以從 https://www.gradle.org/downloads 下載二進制文件,這是最後的手段。只有這個二進制文件是必要的,所以請查找指向gradle-version-bin.zip的鏈接。(你也可以選擇gradle-version-all.zip以獲取源代碼和文檔以及二進制文件。)
解壓縮下載的文件到你的電腦,並且把bin文件夾到你的路徑。
運行Gradle,測試Gradle的安裝是否成功。使用以下命令。
gradle
如果一切順利,你會看到一個歡迎信息:
:help
Welcome to Gradle 2.3.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
BUILD SUCCESSFUL
Total time: 2.675 secs
那麼你現在就已經安裝好Gradle了。
看看Gradle能做什麼
既然現在Gradle已經安裝好了,那就看看它能做什麼。在你創建一個項目的build.gradle文件時,你可以查看它有哪些任務是可用的。
gradle tasks
你應該看到一個可用任務列表。假設你運行Gradle在一個沒有build.gradle文件的文件夾,你會看見一些非常基礎的任務,例如:
:tasks
== All tasks runnable from root project
== Build Setup tasks
setupBuild - Initializes a new Gradle build. [incubating]
== Help tasks
dependencies - Displays all dependencies declared in root project 'gs-gradle'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gs-gradle'.
help - Displays a help message
projects - Displays the sub-projects of root project 'gs-gradle'.
properties - Displays the properties of root project 'gs-gradle'.
tasks - Displays the tasks runnable from root project 'gs-gradle'.
To see all tasks and more detail, run with --all.
BUILD SUCCESSFUL
Total time: 3.077 secs
即使這些任務可以使用,沒有一個項目構建配置,他們沒有多大的價值。當你提供了build.gradle文件,一些任務變得更有用。當你向build.gradle加入插件,任務列表會變長,所以你會有時會想再次運行 task 來看那些任務可用。
說到加入插件,下一步是加入一個啓用基本java構建功能的插件。
構建java代碼
從簡單開始,創建一個最基礎的build.gradel文件到項目文件夾,這個文件夾是你在指南開頭創建的。在文件中只需寫入一行代碼:
apply plugin: 'java'
在構建配置中的這一行代碼帶來了非常有用的作用。再次運行 gradle tasks,會看到新的任務加入了這個列表,包括構建項目,創建JavaDoc,運行測試的任務。
你將經常使用 gradle build 任務。這個任務編譯,測試,組裝代碼到一個JAR文件。你可以運行以下命令來使用:
gradle build
等待幾秒,“BUILD SUCCESSFUL”說明構建已經完成。 請檢查 build 文件夾,查看構建工作的結果。在其中你會找到一系列的文件夾,包括以下三個值得注意的文件夾。
- classes。此項目的已編譯的.class文件。
- reports。該文件夾由build生成(比如test reports)
- libs。整合的項目的庫(通常是JAR或者WAR文件)。
classes 文件夾包含 從Java代碼編譯出來的.class文件。特別地,你應該在裏面找HelloWorld.class和Greeter.class.
在此刻,這個項目沒有任何庫依賴,所以在dependency_cache文件夾中沒有任何文件。
reports 文件夾應包含一個項目的運行時單元測試報告。因爲這個項目還沒有單元測試,所以這個報告不會有趣。
libs 文件夾應包含一個以項目文件夾名字命名的JAR文件。再向下,你將看見你如何指定JAR文件名和它的版本的方法
聲明依賴
這個簡單的Hello World例子是完全地獨立和不依賴任何額外的庫。然而,很多應用依賴於外部的庫來處理通常的或者複雜的功能。
舉個例子,假設除了說“Hello,World”之外,你想要這個應用打印當前日期和時間,你應當使用原生java庫裏的日期和時間工具,不過你也可以使用Joda Time庫使得它更有趣。
首先,編輯 HelloWorld.java 如以下:
package hello;
import org.joda.time.LocalTime;
public class HelloWorld {
public static void main(String[] args) {
LocalTime currentTime = new LocalTime();
System.out.println("The current local time is: " + currentTime);
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
這裏的HelloWorld使用了Joda Time的LocalTime類來獲得和打印當前時間
如果你現在運行gradle build 來構建項目,那麼它會失敗,因爲你還沒有聲明Jada Time 作爲這次構建的編譯依賴
對於初學者,需要爲第三方庫加入源。
repositories {
mavenCentral()
}
repositories代碼塊指示了這次構建應該從Maven Central 庫中解決它的依賴關係。Gradle嚴重依賴由Maven 構建工具創建的規範和功能,包括使用Maven Central的可選項當作庫依賴的源。
既然我們已經加入了第三方庫,那麼讓我們聲明他們。
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
compile "joda-time:joda-time:2.2"
testCompile "junit:junit:4.12"
}
根據dependencies代碼塊,你聲明一個Joda Time的單一的依賴。特別地,你請求的是joda-time組中的joda-time庫的2.2版本。
關於這個依賴有一點值得注意,就是它是一個compile依賴,說明了在compole-time過程中它可能是可用的(如果你正在構建一個WAR文件,包括這個WAR的/WEB-INF/libs文件夾)另外值得注意的依賴類型包括:
- providedCompile。編譯代碼所必要的依賴,但是它由一個運行這代碼的容器在運行時提供的(例如,Java Servlet API)
- testCompole。被用來編譯和運行測試的依賴,但是對於構建或運行項目的運行時代碼是非必須的。
最後,讓我們指定我們JAR成品的名字。
jar {
baseName = 'gs-gradle'
version = '0.1.0'
}
jar代碼塊決定這個JAR將怎樣被命名,在這裏,它的名字是gs-gradle-0.1.0.jar。
現在如果你運行gradle build,Gradle應該會從Maven Central倉庫中解決Joda Time的依賴並且構建將會成功。
使用Gradle Wrapper 構建你的項目
Gradle Wrapper是開始一個Gradle build的首選方法。它由windows批處理腳本和OSX、Linux的shell腳本組成。