第7章 Java Quickstart 快速開始 Java

2018-02-24 15:56 更新

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

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

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

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

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

7.2. A basic Java project 基本的 Java 項目

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

Example 7.1. Using the Java plugin

build.gradle

apply plugin: 'java'

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

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

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

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

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

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

check

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

7.2.2. External dependencies 外部依賴

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

Example 7.3. Adding Maven repository

build.gradle

repositories {
    mavenCentral()
}

我們添加一些依賴,聲明了 編譯時 需要的依賴和測試時需要的依賴

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ǔ)知識

7.2.3. Customizing the project 自定義 項目

在 Java 插件添加屬性到您的項目。這些屬性通常足在啟動時使用默認值。如果他們不適合你,你很容易改他們。讓我們看一看我們的示例。在這里,我們將說明我們的 Java 項目的版本號,包括 Java 的版本號。我們也添加一些屬性的 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 的機制。例如,您可以設(shè)置 task 的性能,添加行為的一個任務(wù),更改 task 的依賴,或替換完全的 task 。在我們的示例,我們將配置測試 task ,這是類型?Test?,增加一個系統(tǒng)屬性,當(dāng)執(zhí)行測試時:

Example 7.6. Adding a test system property

build.gradle

test {
    systemProperties 'property': 'value'
}

有哪些屬性存在?

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

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

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

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)建一個 Eclipse project

創(chuàng)建 Eclipse 特點的描述文件,比如 .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)建

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

Example 7.10. Multi-project build - hierarchical layout

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

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

里面包含 4 個 project。?api?是產(chǎn)生出 JAR 文件 給客戶端加載提供給 Java 客戶端需要的 XML webservice。?webservice是一個 web 應(yīng)用返回 XML 。shared?包含了?api、webservice?使用的代碼。項目?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 多項目構(gòu)建

7.3.2. Common configuration 常見配置

有很多常見的配置。我們的示例中使用了 configuration injection (配置注入)。在這里,根項目就像一個容器,subprojects 方法遍歷容器中的元素(實例中的 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 和配置屬性將會出現(xiàn)在雖偶有 子 project 中。所以,你可以 在根 project 目錄中,運行 gradle build 來編譯、測試、將所有 project 打包成 JAR 。

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

7.3.3. Dependencies between projects 項目間的依賴

在相同的構(gòu)建里,您可以添加項目之間的依存關(guān)系,這樣,例如,一個項目的 JAR 文件可以用來編譯另外一個項目。在api?構(gòu)建文件中我們將添加對shared項目的依賴。由于這種依賴,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 多項目構(gòu)建?中 Section 57.7.1, “Disabling the build of dependency projects” 如何禁用這個功能

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ǔ)知識

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號