第7章 Java Quickstart 快速開始 Java

2018-02-24 15:56 更新

7.1. The Java plugin 關(guān)于 Java 插件

Gradle 是一個(gè)通用的構(gòu)建工具,它能構(gòu)建任何基于你的構(gòu)建腳本的東西。開箱即用,當(dāng)然除非你添加代碼到你的構(gòu)建腳本里,不然它不會(huì)構(gòu)建任何東西。

很多 Java 項(xiàng)目都有類似的基本流程:編譯 Java 源文件,運(yùn)行單元測(cè)試,創(chuàng)建 JAR 文件。如果你不是把代碼從頭寫到尾,那還能接受。現(xiàn)在有了 Gradle 就不用忍受這些。解決問題的方法就是 插件。插件是 Gradle 配置的擴(kuò)展,通常是添加配置前的 task。Gradle 裝載很多插件,這樣可以方便共享。其中,Java 插件 就是添加 task 到 project ,會(huì)編譯、單元測(cè)試你的 Java 代碼,并構(gòu)建進(jìn)一個(gè) JAR 文件。

Java 插件 是基于約定的。這意味著,該插件定義了 項(xiàng)目 許多方面的的默認(rèn)值,如 Java 源文件所在的位置。如果你跟隨你的項(xiàng)目的約定,你一般不需要在你的構(gòu)建腳本做太多。Gradle 允許您自定義您的項(xiàng)目,如果你不想或不遵循某種公約。事實(shí)上,因?yàn)?Java 項(xiàng)目的支持作為一個(gè)插件來實(shí)現(xiàn)的,你不需要使用所有的插件來構(gòu)建一個(gè)Java項(xiàng)目,如果你不想。

后續(xù)章節(jié),我們有許多案例關(guān)于 Java 插件、依賴管理、多 project。在這一章中,我們想給你一個(gè)初始的想法關(guān)于如何使用 Java 插件來構(gòu)建一個(gè) Java 項(xiàng)目。

7.2. A basic Java project 基本的 Java 項(xiàng)目

為了使用 Java 插件,添加下面代碼到構(gòu)建文件:

Example 7.1. Using the Java plugin

build.gradle

apply plugin: 'java'

注意,完整的項(xiàng)目源碼見https://github.com/waylau/Gradle-2-User-Guide-Demos?中 java/quickstart

這個(gè)就是 定義一個(gè) Java 項(xiàng)目的全部。它會(huì)將 Java 插件應(yīng)用到項(xiàng)目中,并且添加很多 task。

Gradle 會(huì)在 src/main/java 目錄下尋找產(chǎn)品代碼,在 src/test/java 尋找測(cè)試代碼 。 另外在 src/main/resources 包含了資源的 JAR 文件, src/test/resources 包含了運(yùn)行測(cè)試。所有的輸出都在 build 目錄下,JAR 在 build/libs 目錄下

7.2.1. Building the project 構(gòu)建項(xiàng)目

在 Java 插件增添了相當(dāng)多的 task 在 project 中。然而,只有少數(shù)的task 是需要在 構(gòu)建 project 時(shí)需要的。最常用的任務(wù)是 build task,這就能構(gòu)建一個(gè)完整的 project 。當(dāng)你運(yùn)行 gradle build,Gradle 將編譯和測(cè)試您的代碼,并創(chuàng)建一個(gè)包含您的主要類和資源的 JAR 文件。

Example 7.2. Building a Java project

執(zhí)行 gradle build 輸出

> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Total time: 1 secs

其他有用的 task 有:

clean

刪除 build 目錄,移除所有構(gòu)建的文件

assemble

編譯打包代碼,但不運(yùn)行單元測(cè)試。其他插件帶給這個(gè) task 更多特性,比如如果你使用 War 插件,task 將給 project 構(gòu)建 WAR 文件

check

編譯測(cè)試你的代碼。其他插件帶給這個(gè) task 提供更多檢查類型。比如,你使用 checkstyle 插件, 這個(gè) task 建輝在你的代碼中 執(zhí)行 Checkstyle

7.2.2. External dependencies 外部依賴

Java 項(xiàng)目經(jīng)常會(huì)有一些外部 JAR 的依賴。為了引用這些 JAR 文件,需要在 Gradle 里面配置。在 Gradle,類似與 JAR 文件將會(huì)放在 repository 中。一個(gè) repository 可以被依賴的項(xiàng)目獲取到,或者提交項(xiàng)目的拷貝到 repository 中,或者兩者都可。比如,我們使用 Maven repository :

Example 7.3. Adding Maven repository

build.gradle

repositories {
    mavenCentral()
}

我們添加一些依賴,聲明了 編譯時(shí) 需要的依賴和測(cè)試時(shí)需要的依賴

Example 7.4. Adding dependencies

build.gradle

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

詳見Chapter 8. Dependency Management Basics 依賴管理的基礎(chǔ)知識(shí)

7.2.3. Customizing the project 自定義 項(xiàng)目

在 Java 插件添加屬性到您的項(xiàng)目。這些屬性通常足在啟動(dòng)時(shí)使用默認(rèn)值。如果他們不適合你,你很容易改他們。讓我們看一看我們的示例。在這里,我們將說明我們的 Java 項(xiàng)目的版本號(hào),包括 Java 的版本號(hào)。我們也添加一些屬性的 JAR 文件清單。

Example 7.5. Customization of MANIFEST.MF

build.gradle

sourceCompatibility = 1.5
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart',
                   'Implementation-Version': version
    }
}

Java 插件添加的 task 和 平常的 task 完全一樣,在構(gòu)建文件中聲明。這意味著你可以使用任何在前面的章節(jié)中自定義這些 task 的機(jī)制。例如,您可以設(shè)置 task 的性能,添加行為的一個(gè)任務(wù),更改 task 的依賴,或替換完全的 task 。在我們的示例,我們將配置測(cè)試 task ,這是類型?Test?,增加一個(gè)系統(tǒng)屬性,當(dāng)執(zhí)行測(cè)試時(shí):

Example 7.6. Adding a test system property

build.gradle

test {
    systemProperties 'property': 'value'
}

有哪些屬性存在?

執(zhí)行 gradle properties 可以列出 project 的屬性,你可以看到 Java 插件添加的屬性和他們的默認(rèn)值

7.2.4. Publishing the JAR file 發(fā)布 JAR 文件

需要告訴 Gradle 要發(fā)布 JAR 的位置。在 Gradle 中, 產(chǎn)物 比如 JAR 文件等是發(fā)布到庫中的。我們的例子中是發(fā)布到了本地路徑。你也可以發(fā)布到 遠(yuǎn)程位置或者多個(gè)位置。

Example 7.7. Publishing the JAR file

build.gradle

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

執(zhí)行 gradle uploadArchives 來發(fā)布

7.2.5. Creating an Eclipse project 創(chuàng)建一個(gè) Eclipse project

創(chuàng)建 Eclipse 特點(diǎn)的描述文件,比如 .project,需要添加插件

Example 7.8. Eclipse plugin

build.gradle

apply plugin: 'eclipse'

執(zhí)行 gradle eclipse 來生產(chǎn) Eclipse project 文件。更多 eclipse task 相關(guān)內(nèi)容詳見?Chapter 38. The Eclipse Plugin 關(guān)于 Eclipse 插件

7.2.6. Summary 總結(jié)

下面是完整的示例 build 文件

Example 7.9. Java example - complete build file

build.gradle

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

sourceCompatibility = 1.5
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart',
                   'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

test {
    systemProperties 'property': 'value'
}

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

7.3. Multi-project Java build 多 project 的 Java 構(gòu)建

下面是一個(gè) 多 project 構(gòu)建的 項(xiàng)目結(jié)構(gòu):

Example 7.10. Multi-project build - hierarchical layout

multiproject/
  api/
  services/webservice/
  shared/
  services/shared/

注意,完整的項(xiàng)目源碼見https://github.com/waylau/Gradle-2-User-Guide-Demos?中 java/multiproject

里面包含 4 個(gè) project。?api?是產(chǎn)生出 JAR 文件 給客戶端加載提供給 Java 客戶端需要的 XML webservice。?webservice是一個(gè) web 應(yīng)用返回 XML 。shared?包含了?api、webservice?使用的代碼。項(xiàng)目?services/shared?包含了 依賴shared?的代碼。

7.3.1. Defining a multi-project build 定義 build 文件

配置文件的名字叫 settings.gradle,如下

Example 7.11. Multi-project build - settings.gradle file

settings.gradle

include "shared", "api", "services:webservice", "services:shared"

詳見?Chapter 57. Multi-project Builds 多項(xiàng)目構(gòu)建

7.3.2. Common configuration 常見配置

有很多常見的配置。我們的示例中使用了 configuration injection (配置注入)。在這里,根項(xiàng)目就像一個(gè)容器,subprojects 方法遍歷容器中的元素(實(shí)例中的 project ),并將指定的配置。這樣我們可以很容易地定義所有檔案的 manifest 的內(nèi)容,和一些常見的依賴關(guān)系:

Example 7.12. Multi-project build - common configuration

build.gradle

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse-wtp'

    repositories {
       mavenCentral()
    }

    dependencies {
        testCompile 'junit:junit:4.11'
    }

    version = '1.0'

    jar {
        manifest.attributes provider: 'gradle'
    }
}

注意,示例中 在 所有 子 project 中應(yīng)用了 Java 插件。意思是 task 和配置屬性將會(huì)出現(xiàn)在雖偶有 子 project 中。所以,你可以 在根 project 目錄中,運(yùn)行 gradle build 來編譯、測(cè)試、將所有 project 打包成 JAR 。

注意,插件只應(yīng)用在 subprojects 包含的區(qū)域,其他根級(jí)別的將不適用。

7.3.3. Dependencies between projects 項(xiàng)目間的依賴

在相同的構(gòu)建里,您可以添加項(xiàng)目之間的依存關(guān)系,這樣,例如,一個(gè)項(xiàng)目的 JAR 文件可以用來編譯另外一個(gè)項(xiàng)目。在api?構(gòu)建文件中我們將添加對(duì)shared項(xiàng)目的依賴。由于這種依賴,Gradle 將確保?sharedapi?之前獲得構(gòu)建。

Example 7.13. Multi-project build - dependencies between projects

api/build.gradle

dependencies {
    compile project(':shared')
}

詳見?Chapter 57. Multi-project Builds 多項(xiàng)目構(gòu)建?中 Section 57.7.1, “Disabling the build of dependency projects” 如何禁用這個(gè)功能

7.3.4. Creating a distribution 創(chuàng)建發(fā)布包

添加發(fā)布包,提供給客戶端裝載

Example 7.14. Multi-project build - distribution file

api/build.gradle

task dist(type: Zip) {
    dependsOn spiJar
    from 'src/dist'
    into('libs') {
        from spiJar.archivePath
        from configurations.runtime
    }
}

artifacts {
   archives dist
}

7.4. Where to next? 下步工作

你可以查看更多關(guān)于 Java 插件 ,見Chapter 23. The Java Plugin 關(guān)于 Java 插件。也可以在https://github.com/waylau/Gradle-2-User-Guide-Demos?中 java 目錄下,看到更多 Java 的示例

繼續(xù)?Chapter 8. Dependency Management Basics 依賴管理的基礎(chǔ)知識(shí)

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)