鍍金池/ 教程/ 物聯(lián)網(wǎng)/ 構建Java項目
依賴管理實戰(zhàn)
配置遠程倉庫
安裝Gradle
簡介
項目自動化簡介
配置子項目
Gradle強大的特性
自動化測試
簡介
掌握構建生命周期
使用命令行操作
構建Java項目
管理任務
構建工具
連續(xù)傳遞的特性
用Gradle開發(fā)Web項目
聲明依賴
構建塊
簡介
測試Java應用
java構建工具
為什么選擇Gradle
拆分項目文件
單元測試
多項目打包
Gradle 起步
介紹這個Gradle項目
簡介
自定義腳本
Gradle包裝器
簡要概述依賴管理
項目模塊化

構建Java項目

上一節(jié)我們簡要介紹了如何編寫一個單機的To Do應用,接下來要打包部署成可執(zhí)行的應用,我們需要編譯源代碼,生成的class文件需要打包到JAR文件中。JDK提供了javac 和jar工具幫助你實現(xiàn)這些任務,但是你也不想每次源代碼發(fā)生變化時你都手動去執(zhí)行這些任務吧。

Gradle插件能夠自動化完成這些任務,插件引入了一些領域特有的觀念,其中一個Gradle插件就是java插件,Java插件不僅僅只有編譯和打包的功能,它給你的項目安排了一個標準布局,并確保你所有的任務都是按序執(zhí)行,現(xiàn)在該應用java插件來構建你的build腳本了。

使用java插件

每個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