使用Gradle構(gòu)建Java項(xiàng)目(譯自springboot官網(wǎng))

使用Gradle構(gòu)建Java項(xiàng)目

這個(gè)指南將指導(dǎo)你如何使用Gradle構(gòu)建一個(gè)簡(jiǎn)單的Java項(xiàng)目

你將構(gòu)建什么

你將創(chuàng)建一個(gè)簡(jiǎn)單的項(xiàng)目檀咙,由Gradle構(gòu)建脏款。

你需要什么

  • 大約15分鐘
  • 一個(gè)你喜愛(ài)的文本編輯器或者IDE
  • JDK 6 或者 往后至最新的JDK

怎么完整走完這個(gè)指南

就像很多Spring入門指南梳凛,你可以從零開(kāi)始霍衫,一步一個(gè)腳印實(shí)現(xiàn)身堡,或者你可以跳過(guò)你熟悉的步驟睹酌,不管怎么樣权谁,你最后會(huì)得到可以工作的代碼。

移步到++設(shè)置項(xiàng)目++憋沿,從頭開(kāi)始

做以下步驟以跳過(guò)基本教程

  • ++下載++并且解壓本指南的源代碼倉(cāng)庫(kù)旺芽,或者使用Git克隆
git clone https://github.com/spring-guides/gs-gradle.git
  • cd進(jìn)入
gs-gradle/initial
  • 跳到 Install Gradle

當(dāng)你完成上面的步驟,你可以那你得到的結(jié)果與

gs-gradle/complete

里的代碼對(duì)比辐啄。

設(shè)置項(xiàng)目

首先采章,為Gradle設(shè)置一個(gè)java項(xiàng)目來(lái)構(gòu)建。為了把重點(diǎn)放在Gradle壶辜,我們盡量地把例子做得簡(jiǎn)單悯舟。

創(chuàng)建目錄結(jié)構(gòu)

在一個(gè)由你選擇的項(xiàng)目文件夾,創(chuàng)建以下子目錄機(jī)構(gòu)砸民;例如图谷,在類unix系統(tǒng)運(yùn)行

mkdir -p src/main/java/hello
└── src
   └── main
       └── java
           └── hello

在 src/main/java/hello 目錄里,你可以自由新建Java類阱洪。為了簡(jiǎn)單的緣故和為了下文的操作保持一致性,Spring推薦你創(chuàng)建兩個(gè)類:==HelloWorld.java== 和 ==Greeter.java.==

==src/main/java/hello/HelloWorld.java==

package hello;

public class HelloWorld {
  public static void main(String[] args) {
    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}

==src/main/java/hello/Greeter.java==

package hello;

public class Greeter {
  public String sayHello() {
    return "Hello world!";
  }
}

安裝Gradle

既然現(xiàn)在有了一個(gè)可以使用Gradle構(gòu)建的項(xiàng)目菠镇,那么接著安裝Gradle
強(qiáng)烈推薦使用安裝器:

  • SDKMAN
  • Homebrew(brew install gradle)

如果以上工具都不適用于你的情況冗荸,你可以從 https://www.gradle.org/downloads 下載二進(jìn)制文件,這是最后的手段利耍。只有二進(jìn)制文件是不可缺的蚌本,所以請(qǐng)查找指向gradle-version-bin.zip的鏈接。(也可以選擇gradle-version-all.zip以獲取源代碼和文檔以及二進(jìn)制文件隘梨。)

解壓縮下載的文件程癌,并且把bin文件夾加入到環(huán)境變量。

運(yùn)行Gradle轴猎,測(cè)試Gradle的安裝是否成功(項(xiàng)目文件夾內(nèi))嵌莉。使用以下命令。

gradle

如果一切順利捻脖,會(huì)看到一個(gè)歡迎信息:

: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

那么你現(xiàn)在就已經(jīng)安裝好Gradle了锐峭。

看看Gradle能做什么

既然現(xiàn)在Gradle已經(jīng)安裝好了,那就看看它能做什么可婶。在你創(chuàng)建一個(gè)項(xiàng)目的build.gradle文件時(shí)沿癞,你可以查看它有哪些任務(wù)是可用的。

gradle tasks

你應(yīng)該看到一個(gè)可用任務(wù)列表矛渴。假設(shè)你運(yùn)行Gradle在一個(gè)沒(méi)有build.gradle文件的文件夾椎扬,你會(huì)看見(jiàn)一些非常基礎(chǔ)的任務(wù),例如:

: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

即使這些任務(wù)可以使用蚕涤,沒(méi)有一個(gè)項(xiàng)目構(gòu)建配置筐赔,他們沒(méi)有多大的價(jià)值。當(dāng)你提供了build.gradle文件钻趋,一些任務(wù)變得更有用川陆。當(dāng)你向build.gradle加入插件,任務(wù)列表會(huì)變長(zhǎng)蛮位,所以你會(huì)有時(shí)會(huì)想再次運(yùn)行 task 來(lái)看那些任務(wù)可用逊谋。

說(shuō)到加入插件,下一步是加入一個(gè)啟用基本java構(gòu)建功能的插件氧急。

構(gòu)建java代碼

從簡(jiǎn)單開(kāi)始拐叉,創(chuàng)建一個(gè)最基礎(chǔ)的build.gradel文件到項(xiàng)目文件夾,這個(gè)文件夾是你在指南開(kāi)頭創(chuàng)建的萄焦。在文件中只需寫(xiě)入一行代碼:

apply plugin: 'java'

在構(gòu)建配置中的這一行代碼帶來(lái)了非常有用的作用控轿。再次運(yùn)行 gradle tasks,會(huì)看到新的任務(wù)加入了這個(gè)列表拂封,包括構(gòu)建項(xiàng)目茬射,創(chuàng)建JavaDoc,運(yùn)行測(cè)試的任務(wù)冒签。

你將經(jīng)常使用 gradle build 任務(wù)在抛。這個(gè)任務(wù)編譯,測(cè)試萧恕,組裝代碼到一個(gè)JAR文件刚梭。你可以運(yùn)行以下命令來(lái)使用:

gradle build

等待幾秒,“BUILD SUCCESSFUL”說(shuō)明構(gòu)建已經(jīng)完成票唆。
請(qǐng)檢查 build 文件夾朴读,查看構(gòu)建工作的結(jié)果。在其中你會(huì)找到一系列的文件夾走趋,包括以下三個(gè)值得注意的文件夾衅金。

  • classes。此項(xiàng)目的已編譯的.class文件簿煌。
  • reports典挑。該文件夾由build生成(比如test reports)
  • libs。整合的項(xiàng)目的庫(kù)(通常是JAR或者WAR文件)啦吧。

classes 文件夾包含 從Java代碼編譯出來(lái)的.class文件您觉。特別地,你應(yīng)該在里面找HelloWorld.class和Greeter.class.

在此刻授滓,這個(gè)項(xiàng)目沒(méi)有任何庫(kù)依賴琳水,所以在dependency_cache文件夾中沒(méi)有任何文件肆糕。

reports 文件夾應(yīng)包含一個(gè)項(xiàng)目的運(yùn)行時(shí)單元測(cè)試報(bào)告。因?yàn)檫@個(gè)項(xiàng)目還沒(méi)有單元測(cè)試在孝,所以這個(gè)報(bào)告不會(huì)有趣诚啃。

libs 文件夾應(yīng)包含一個(gè)以項(xiàng)目文件夾名字命名的JAR文件。再向下私沮,你將看見(jiàn)你如何指定JAR文件名和它的版本的方法

聲明依賴

這個(gè)簡(jiǎn)單的Hello World例子是完全地獨(dú)立和不依賴任何額外的庫(kù)始赎。然而,很多應(yīng)用依賴于外部的庫(kù)來(lái)處理通常的或者復(fù)雜的功能仔燕。

舉個(gè)例子造垛,假設(shè)除了說(shuō)“Hello,World”之外,你想要這個(gè)應(yīng)用打印當(dāng)前日期和時(shí)間晰搀,你應(yīng)當(dāng)使用原生java庫(kù)里的日期和時(shí)間工具五辽,不過(guò)你也可以使用Joda Time庫(kù)使得它更有趣。

首先外恕,編輯 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類來(lái)獲得和打印當(dāng)前時(shí)間

如果你現(xiàn)在運(yùn)行g(shù)radle build 來(lái)構(gòu)建項(xiàng)目杆逗,那么它會(huì)失敗,因?yàn)槟氵€沒(méi)有聲明Jada Time 作為這次構(gòu)建的編譯依賴

對(duì)于初學(xué)者鳞疲,需要為第三方庫(kù)加入源罪郊。

repositories {
    mavenCentral()
}

repositories代碼塊指示了這次構(gòu)建應(yīng)該從Maven Central 庫(kù)中解決它的依賴關(guān)系。Gradle嚴(yán)重依賴由Maven 構(gòu)建工具創(chuàng)建的規(guī)范和功能尚洽,包括使用Maven Central的可選項(xiàng)當(dāng)作庫(kù)依賴的源排龄。

既然我們已經(jīng)加入了第三方庫(kù),那么讓我們聲明他們翎朱。

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile "joda-time:joda-time:2.2"
    testCompile "junit:junit:4.12"
}

根據(jù)dependencies代碼塊,你聲明一個(gè)Joda Time的單一的依賴尺铣。特別地拴曲,你請(qǐng)求的是joda-time組中的joda-time庫(kù)的2.2版本。

關(guān)于這個(gè)依賴有一點(diǎn)值得注意凛忿,就是它是一個(gè)compile依賴澈灼,說(shuō)明了在compole-time過(guò)程中它可能是可用的(如果你正在構(gòu)建一個(gè)WAR文件,包括這個(gè)WAR的/WEB-INF/libs文件夾)另外值得注意的依賴類型包括:

  • providedCompile店溢。編譯代碼所必要的依賴叁熔,但是它由一個(gè)運(yùn)行這代碼的容器在運(yùn)行時(shí)提供的(例如,Java Servlet API)
  • testCompole床牧。被用來(lái)編譯和運(yùn)行測(cè)試的依賴荣回,但是對(duì)于構(gòu)建或運(yùn)行項(xiàng)目的運(yùn)行時(shí)代碼是非必須的。

最后戈咳,讓我們指定我們JAR成品的名字心软。

jar {
    baseName = 'gs-gradle'
    version =  '0.1.0'
}

jar代碼塊決定這個(gè)JAR將怎樣被命名壕吹,在這里,它的名字是gs-gradle-0.1.0.jar删铃。

現(xiàn)在如果你運(yùn)行g(shù)radle build耳贬,Gradle應(yīng)該會(huì)從Maven Central倉(cāng)庫(kù)中解決Joda Time的依賴并且構(gòu)建將會(huì)成功。

使用Gradle Wrapper 構(gòu)建你的項(xiàng)目

Gradle Wrapper是啟動(dòng)一個(gè)Gradle build的首選方法猎唁。它由windows批處理腳本和OSX咒劲、Linux的shell腳本組成。這些腳本允許你無(wú)需在你的系統(tǒng)中安裝Gradle即可運(yùn)行一個(gè)Gradle build诫隅。這些原本是被添加到build文件的東西腐魂,現(xiàn)在他們已經(jīng)被包含在Gradle里,所以不再有任何額外的要求阎肝。簡(jiǎn)單地使用以下命令:

gradle wrapper --gradle-version 2.13

在任務(wù)執(zhí)行完后挤渔,會(huì)出現(xiàn)一些新文件,當(dāng)wrapper jar和properties文件被加入到一個(gè)新的==gradle/wrapper==文件夾风题,這兩個(gè)腳本在最上層的文件夾(root of the folder)

└── <project folder>
    └── gradlew
    └── gradlew.bat
    └── gradle
        └── wrapper
            └── gradle-wrapper.jar
            └── gradle-wrapper.properties

現(xiàn)在可以用Gradle Wrapper來(lái)構(gòu)建你的項(xiàng)目了判导。把它加入到你的版本控制系統(tǒng),每個(gè)克隆你項(xiàng)目的人就可以以同樣的配置構(gòu)建它了沛硅。它的使用方法同==安裝版本的Gradle==一樣眼刃。運(yùn)行wrapper腳本來(lái)進(jìn)行構(gòu)建任務(wù),就像你之前做的:

./gradlew build

第一次運(yùn)行Gradle的某版本的wrapper摇肌,它會(huì)下載和緩存該版本的的Gradle二進(jìn)制文件擂红。Gradle Wrapper 文件設(shè)計(jì)為已經(jīng)被提交到了資源控制,這樣子不必每個(gè)人安裝和配置Gradle的某個(gè)版本围小,來(lái)構(gòu)建項(xiàng)目昵骤。

在這個(gè)階段,你將編寫(xiě)你的代碼肯适,你會(huì)在這看到結(jié)果变秦。

build
├── classes
│   └── main
│       └── hello
│           ├── Greeter.class
│           └── HelloWorld.class
├── dependency-cache
├── libs
│   └── gs-gradle-0.1.0.jar
└── tmp
    └── jar
        └── MANIFEST.MF

包括兩個(gè)預(yù)期的class文件:Greeter和HelloWorld,還有JAR文件】蛱颍快速預(yù)覽:

$ jar tvf build/libs/gs-gradle-0.1.0.jar
  0 Fri May 30 16:02:32 CDT 2014 META-INF/
 25 Fri May 30 16:02:32 CDT 2014 META-INF/MANIFEST.MF
  0 Fri May 30 16:02:32 CDT 2014 hello/
369 Fri May 30 16:02:32 CDT 2014 hello/Greeter.class
988 Fri May 30 16:02:32 CDT 2014 hello/HelloWorld.class

這些類文件被綁在了一起蹦玫。需要非常注意的是,即使你聲明了joda-time作為依賴刘绣,此處也不會(huì)有該類庫(kù)樱溉。而且JAR文件也不可運(yùn)行。

為了使這些代碼可以運(yùn)行纬凤,我們可以使用gradle的application補(bǔ)丁福贞。把它加入到你的build.gradle文件

apply plugin: 'application'

mainClassName = 'hello.HelloWorld'

然后就可以把a(bǔ)pp跑起來(lái)了。

$ ./gradlew run
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
The current local time is: 16:16:20.544
Hello world!

BUILD SUCCESSFUL

Total time: 3.798 secs

打包依賴需要更多的考慮停士。比如說(shuō)肚医,如果我們要打包一個(gè)WAR包(一種格式绢馍,通常關(guān)聯(lián)到第三方依賴的打包),我們可以使用gradle的 WAR 插件,如果你正使用SpringBoot而且想得到一個(gè)可運(yùn)行的JAR文件肠套,使用spring-boot-gradle-plugin是非常方便的舰涌。在這一步中,gradle對(duì)你的系統(tǒng)并不夠了解你稚,無(wú)法做出選擇瓷耙,不過(guò)現(xiàn)在,使用gradle讓它跑起來(lái)是足夠了的刁赖。

要完成本指南的內(nèi)容搁痛,這里有已完成的build.gradle文件:

build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'

mainClassName = 'hello.HelloWorld'

// tag::repositories[]
repositories {
    mavenCentral()
}
// end::repositories[]

// tag::jar[]
jar {
    baseName = 'gs-gradle'
    version =  '0.1.0'
}
// end::jar[]

// tag::dependencies[]
sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile "joda-time:joda-time:2.2"
    testCompile "junit:junit:4.12"
}
// end::dependencies[]

// tag::wrapper[]
// end::wrapper[]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宇弛,隨后出現(xiàn)的幾起案子鸡典,更是在濱河造成了極大的恐慌,老刑警劉巖枪芒,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彻况,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舅踪,警方通過(guò)查閱死者的電腦和手機(jī)纽甘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抽碌,“玉大人悍赢,你說(shuō)我怎么就攤上這事』踽悖” “怎么了左权?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)痴颊。 經(jīng)常有香客問(wèn)我赏迟,道長(zhǎng),這世上最難降的妖魔是什么祷舀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮烹笔,結(jié)果婚禮上裳扯,老公的妹妹穿的比我還像新娘。我一直安慰自己谤职,他們只是感情好饰豺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著允蜈,像睡著了一般冤吨。 火紅的嫁衣襯著肌膚如雪蒿柳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天漩蟆,我揣著相機(jī)與錄音垒探,去河邊找鬼。 笑死怠李,一個(gè)胖子當(dāng)著我的面吹牛圾叼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捺癞,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼夷蚊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了髓介?” 一聲冷哼從身側(cè)響起惕鼓,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唐础,沒(méi)想到半個(gè)月后箱歧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彻犁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年叫胁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汞幢。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驼鹅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出森篷,到底是詐尸還是另有隱情输钩,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布仲智,位于F島的核電站买乃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钓辆。R本人自食惡果不足惜剪验,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望前联。 院中可真熱鬧功戚,春花似錦、人聲如沸似嗤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烁落。三九已至乘粒,卻和暖如春豌注,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灯萍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工轧铁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竟稳。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓属桦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親他爸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聂宾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353