使用Gradle構建Java項目

使用Gradle構建Java項目

這個手冊將經過一個簡單的Java項目向你們介紹如何使用Gradle構建Java項目。php

咱們將要作什麼?

咱們將在這篇文檔航中建立一個簡單的Java項目,而後使用Gradle構建它。html

須要準備什麼?

  • 預留15分鐘空閒時間
  • 一件稱手的兵器(你最喜歡的IDE或者文本編輯器)
  • Java環境([JDK6](http://www.oracle.com/technetwork/java/javase/downloads/index.html」JDK」及以上版本)

如何完成這個手冊的內容?

與大多數Spring的入門手冊同樣,你能夠從頭開始一步步完成教程中的每一步工做,也能夠跳過你已經爛熟的基礎步驟。無論採用那種方式,你最後都會獲得可工做的代碼。java

  1. 若是要重頭開始,猛戳這裏
  2. 若是要跳過基礎部分,需執行如下操做:
    • 下載並解壓本文檔相關源代碼,或者使用Git克隆一個:git clone https://github.com/spring-guides/gs-gradle.git
    • cd 進入 gs-gradle/initial
    • 參考到安裝Gradle部分

當你完成後,你可使用gs-gradle/complete來檢查你的結果。git

配置項目

首先須要配置一個項目給Gradle進行構建。爲了保證咱們能專一於Gradle,目前最好建立最簡單的Java項目。github

建立目錄結構

在項目主目錄下,建立如下子目錄;在*nix系統下可使用命令:mkdir -p src/main/java/hellospring

1windows

2oracle

3app

4eclipse

└── src

    └── main

        └── java

            └── hello

src/main/java/hello目錄中,你能夠建立任何Java類。爲簡單起見而且爲了與指南的其他部分保持一致,咱們建議建立兩個雷HelloWorld.javaGreeter.java

src/main/java/hello/HelloWorld.java的源代碼:

1

2

3

4

5

6

7

8

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的源代碼:

1

2

3

4

5

6

7

package hello;

 

public class Greeter {

  public String sayHello() {

    return "Hello world!";

  }

}

安裝Gradle

到目前爲止,咱們已經搭建了一個能夠用來使用Gradle構建的項目,如今到了安裝Gradle的時候了。

Gradle能夠從http://www.gradle.org/downloads下載。咱們僅須要下載Gradle的二進制發佈包,因此在剛纔提供的鏈接上尋找gradle-version-bin.zip文件(固然,也能夠下載gradle-version-all.zip,它包含源代碼、文檔以已編譯代碼)

解壓縮下載的文件,並將解壓後目錄中的bin目錄加到環境變量中。

能夠在命令行中執行如下代碼來測試Gradle是否安裝成功

1

gradle

若是你很幸運,嘛事都OK,你會看到下面的welcome信息:

1

2

3

4

5

6

7

8

9

10

11

12

13

:help

 

Welcome to Gradle 1.8.

 

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能夠作些什麼呢?

Gradle已經安裝到系統上了,那麼它能夠作什麼呢?在咱們爲項目建立build.gradle文件以前,咱們能夠先問一下Gradle目前有哪些可用的任務(Tasks):

1

gradle tasks

咱們能夠看到可用任務(Tasks)的列表。假設你執行Gradle的目錄不存在build.gradle文件,你能夠看到一些很是基礎的任務,相似於:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

:tasks

 

== All tasks runnable from root project

 

== Build Setup tasks

setupBuild - Initializes a new Gradle build. [incubating]

wrapper - Generates Gradle wrapper files. [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中配置了插件(plugins)上面的任務列表會變得更長,最好在配置插件後使用gradle task看看那些任務是可用的。

剛說到配置插件,立刻咱們就會配置一個插件來啓用基礎的Java構建功能。

構建Java代碼

先從簡單的開始,建立一個最簡單的只有一行的build.gradle文件:

1

apply plugin: 'java'

別看只有一行配置,提供的能力可不是一點點哦。再執行一下gradle task,咱們能夠看到任務列表中增長了一些內容,好比:用來編譯java項目的任務、用來建立JavaDoc的任務、用來執行單元測試的任務。

咱們常用的任務是gradle build,這個任務執行如下操做:編譯、執行單元測試、組裝Jar文件:

1

gradle build

幾秒鐘之後,會看到」BUILD SUCCESSFUL」輸出,說明構建已經完成了。

能夠到」build」目錄中查看構建結構,在這個目錄中咱們能夠看到不少子目錄,其中有三個咱們須要特別注意:

  • classes: 保存被編譯後的.class文件
  • reports: 構建報告(如:測試報告)
  • lib: 組裝好的項目包(一般爲:.jar或者.war文件)

classes目錄包含編譯生成的全部.class文件。執行完編譯後,咱們應該能夠在這裏找到」HelloWorld.class」和」Greeter.class」。

到目前爲止,咱們項目並無申明任何依賴,因此」debendency_cache」目錄是空的。

「reports」目錄會包含項目單元測試的測試報告,固然,當前項目並未編寫任何單元測試,因此,也是空目錄。

「lib」目錄包含打包後的jar或war文件,在後面的內容中咱們將學會如何定義JAR的名稱和版本號。

申明依賴

咱們的Hello World例程很是簡單且不依賴於任何第三方庫,可是大多數應用程序都會依賴第三方庫提供的通用或複雜的功能。

例如:假設咱們但願更好的說」Hello World!」,咱們但願應用程序能同時輸出當前的日期和時間。固然這可使用Java自身的日期和時間相關庫,可是咱們可使用」Joda Time」庫實現更有趣的功能。

首先,把HelloWorld.jara類修改爲下面這樣:

1

2

3

4

5

6

7

8

9

10

11

12

13

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來構建項目,構建過程將會失敗,由於咱們並未將」Joda Time」庫聲明爲編譯時依賴庫。

首先,咱們須要添加一些配置來定義第三方庫的來源:

1

2

3

4

repositories {

    mavenLocal()

    mavenCentral()

}

上面的repositories定義,告訴構建系統經過Maven中央庫來檢索項目依賴的軟件包,Gradle在很大程度上依賴Maven構建工具的許多約定和基礎功能,包括使用Maven中央的庫來處理依賴關係。

如今咱們可使用第三方庫了,但現須要定義:

1

2

3

dependencies {

    compile "joda-time:joda-time:2.2"

}

使用dependencies塊,咱們定義了一條Joda Time的依賴項。這裏,明確指定使用joda-time組內的版本爲2.2的joda-time庫。

另外一個要注意的是,咱們在這個依賴定義中指定依賴是compile範圍的。意思是,這個庫在編譯和運行時都須要(若是咱們正在構建WAR文件,這個文件會在/WEB-INF/libs目錄下)。另外值得注意的依賴類型包括:

  • providedCompile:在編譯期間須要這個依賴包,但在運行期間可能由容器提供相關組件(好比:Java Servlet API)
  • testCompile:依賴項僅在構建和運行測試代碼時須要,在項目運行時不須要這個依賴項。

最後,咱們來定義咱們將生成的Jar文件的名字:

1

2

3

4

jar {

    baseName = 'gs-gradle'

    version =  '0.1.0'

}

jar塊定義如何命名JAR文件,在上面的例子中,咱們的JAR文件的名字爲:gs-gradle-0.1.0.jar

注:這個時候若是執行gradle build,Gradle會花一些時間從Maven中央庫下載Joda Time包(具體下載時間依賴於你的網速)

使用Gradle Wrapper來構建項目

Gradle Wrapper是開始一個Gradle構建的首選方式。它包含了windows批處理以及OS X和Linux的Shell腳本。這些腳本容許咱們在沒有安裝Gradle的系統上執行Gradle構建。要實現這個功能,咱們須要在咱們的build.gradle文件中增長如下代碼:

1

2

3

task wrapper(type: Wrapper) {

    gradleVersion = '1.11'

}

執行下面代碼來下載和初始化wrapper腳本:

1

gradle wrapper

命令執行完後,咱們能夠看到增長了一些新文件。有兩個文件在根目錄下,wapper的jar文件和properties文件在新增的gradle/wrapper目錄下。

1

2

3

4

5

6

7

└── initial

    └── gradlew

    └── gradlew.bat

    └── gradle

        └── wrapper

            └── gradle-wrapper.jar

            └── gradle-wrapper.properties

如今Gradle Wrapper已經能夠用來構建系統了。把這些文件增長到版本控制系統中,而後再任什麼時候候、任何地方只要遷出這些文件就一個按照一樣的方式(與當前生成 Wrapper的Gradle版本一致)構建系統。運行wrapper腳原本構建系統,跟咱們以前橋的命令很像:

1

./gradlew build

當第一次經過wrapper使用指定版本的Gradle構建系統時,wrapper首先下載對應版本的Gradle可執行文件。Gradle Wrapper的全部文件在均可以被提交到版本庫中,因此,任何人均可以在沒有安裝Gradle的環境下使用相同版本的Gradle構建系統。

在這個時候,咱們須要從新構建咱們的代碼,構建的結果目錄以下:

1

2

3

4

5

6

7

8

9

10

11

12

build

├── classes

│   └── main

│       └── hello

│           ├── Greeter.class

│           └── HelloWorld.class

├── dependency-cache

├── libs

│   └── gs-gradle-0.1.0.jar

└── tmp

    └── jar

        └── MANIFEST.MF

Jar文件中包含咱們但願打包的GretterHelloWorld類。

1

2

3

4

5

6

$ 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依賴,但這裏也沒有包括對應的庫文件,並且生成的JAR文件也不是可運行JAR文件。

要想讓代碼能夠運行,咱們可使用Gradle的application插件。增長如下內容到build.gradle文件中。

1

2

3

apply plugin: 'application'

 

mainClassName = 'hello.HelloWorld'

如今咱們的app能夠執行了。

1

2

3

4

5

6

7

8

9

10

11

$ ./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

爲了可以將依賴包也以一塊兒打包,好比,咱們但願構建一個WAR包,能夠包含第三方組件的打包格式,咱們可使用Gradle的WAR插件。若是咱們使用Spring Boot而且但願獲得一個可執行的JAR文件,咱們可使用spring-boot-gradle-plugin插件。在咱們的示例中,gradle沒有足夠的信息來了解咱們的目標系統。可是,目前介紹的內容已經足夠咱們開始使用Gradle了。

下面是本文須要用的的build.gradle文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

apply plugin: 'java'

apply plugin: 'eclipse'

apply plugin: 'application'

 

mainClassName = 'hello.HelloWorld'

 

// tag::repositories[]

repositories {

    mavenLocal()

    mavenCentral()

}

// end::repositories[]

 

// tag::jar[]

jar {

    baseName = 'gs-gradle'

    version =  '0.1.0'

}

// end::jar[]

 

// tag::dependencies[]

dependencies {

    compile "joda-time:joda-time:2.2"

}

// end::dependencies[]

 

// tag::wrapper[]

task wrapper(type: Wrapper) {

    gradleVersion = '1.11'

}

// end::wrapper[]

注意:文件中有不少start/end註釋,這些註釋是爲了方便拷貝文件中的內容到文章的各個部分,在實際使用中不須要包含他們。

總結

恭喜,你已經建立了一個簡單的然而可用的Gradle構建文件來構建Java項目。

相關文章
相關標籤/搜索