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

配置子項(xiàng)目

到目前為止你已經(jīng)把ToDo項(xiàng)目根據(jù)功能拆分成多個模塊,接下來可以用之前的方法來定義構(gòu)建邏輯,下面有幾點(diǎn)需要主要:

  • 根目錄和子目錄使用相同的group和version屬性值
  • 所有的子目錄都是Java項(xiàng)目需要Java插件來正常工作,所以你只需要在子項(xiàng)目中應(yīng)用Java插件
  • web子項(xiàng)目是唯一一個依賴外部庫的項(xiàng)目,它需要打包成WAR而不是JAR
  • 子項(xiàng)目之間可以定義模塊依賴

接下來你將學(xué)習(xí)如何定義特定的和共有的構(gòu)建邏輯,怎么樣去避免重復(fù)的配置。有些子項(xiàng)目可能依賴其他項(xiàng)目的源代碼,比如repository項(xiàng)目依賴model項(xiàng)目,通過聲明項(xiàng)目依賴可以避免拷貝源代碼。

理解項(xiàng)目的API表示

之前我介紹過項(xiàng)目Project可能會用到的一些API,接下來還有一些API用在多項(xiàng)目構(gòu)建中。project方法用于聲明指定項(xiàng)目的構(gòu)建代碼,需要提供項(xiàng)目的路徑,比如:model。有時候你想給所有的項(xiàng)目或者只有子項(xiàng)目定義一些邏輯,你可以使用allprojects和subprojects方法,比如你想給所有的子項(xiàng)目添加Java插件,你需要使用subprojects方法。

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag43.png" alt="" />

定義項(xiàng)目特有的行為

指定項(xiàng)目的行為通過project方法來定義,為了給三個子項(xiàng)目model、repository、web定義構(gòu)建邏輯,你需要給它們分別創(chuàng)建一個配置塊。下面build.gradle文件:

    ext.projectIds = ['group': 'com.manning.gia', 'version': '0.1']

    group = projectIds.group
    version = projectIds.version

    project(':model') {
        group = projectIds.group
        version = projectIds.version
        apply plugin: 'java'
    }

    project(':repository') {
        group = projectIds.group
        version = projectIds.version
        apply plugin: 'java'
    }

    project(':web') {
        group = projectIds.group
        version = projectIds.version
        apply plugin: 'java'
        apply plugin: 'war'
        apply plugin: 'jetty'

    repositories {
        mavenCentral()
    }

    dependencies {
        providedCompile 'javax.servlet:servlet-api:2.5'
        runtime 'javax.servlet:jstl:1.1.2'
    }

    }

從整個項(xiàng)目的根目錄那里,你可以執(zhí)行子項(xiàng)目的任務(wù),需要記住項(xiàng)目路徑是通過冒號分隔,比如你想執(zhí)行model子項(xiàng)目的build任務(wù),在命令行中執(zhí)行g(shù)radle :modle:build就可以,如下所示:

    $ gradle :model:build
    :model:compileJava
    :model:processResources UP-TO-DATE
    :model:classes
    :model:jar
    :model:assemble
    :model:compileTestJava UP-TO-DATE
    :model:processTestResources UP-TO-DATE
    :model:testClasses UP-TO-DATE
    :model:test
    :model:check
    :model:build

聲明項(xiàng)目依賴

聲明項(xiàng)目依賴和聲明外部依賴非常類似,只需要在dependencies配置塊中聲明,如下所示:

    project(':model') {
    ...
    }

    project(':repository') {
    ...

    dependencies {
        //聲明編譯期依賴項(xiàng)目model
        compile project(':model')

    }

    }

    project(':web') {
    ...

    dependencies {
        //聲明編譯期依賴項(xiàng)目repository
        compile project(':repository')
        providedCompile 'javax.servlet:servlet-api:2.5'
        runtime 'javax.servlet:jstl:1.1.2'
    }

    }

這樣就定義了我們的項(xiàng)目依賴,注意當(dāng)一個項(xiàng)目依賴于另一個項(xiàng)目時,另一個項(xiàng)目的項(xiàng)目依賴和外部依賴同樣會被添加進(jìn)來,在構(gòu)建周期的初始化階段,Gradle決定項(xiàng)目的執(zhí)行順序。

從根目錄的執(zhí)行順序是這樣的:

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag44.png" alt="" />

有時候你并不需要重新構(gòu)建那些并未改變的項(xiàng)目,Gradle提供了部分構(gòu)建partial builds的選項(xiàng),通過命令行選項(xiàng)-a或者--no-rebuild。比如你只改變了repository項(xiàng)目不想重新構(gòu)建model子項(xiàng)目,你可以這樣做:gralde :repository:build -a,如下所示:

    $ gradle :repository:build -a
    :repository:compileJava
    :repository:processResources UP-TO-DATE
    :repository:classes
    :repository:jar
    :repository:assemble
    :repository:compileTestJava UP-TO-DATE
    :repository:processTestResources UP-TO-DATE
    :repository:testClasses UP-TO-DATE
    :repository:test
    :repository:check
    :repository:build

定義共同的行為

上面你在所有的子項(xiàng)目中添加了Java插件,給所有的項(xiàng)目添加了一個外部屬性ProjectIds,當(dāng)你的子項(xiàng)目變得比較多的時候這樣子做可能是個問題,接下來你可以通過allprojects和subprojects方法來改善你的構(gòu)建代碼。

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag45.png" alt="" />

這是什么意思?這意味著你可以用allprojects方法給所有的項(xiàng)目添加group和version屬性,由于根項(xiàng)目不需要Java插件,你可以使用subprojects給所有子項(xiàng)目添加Java插件,如下所示:

    allprojects {
        group = 'com.manning.gia'
        version = '0.1'
    }

    subprojects {
        apply plugin: 'java'
    }

    project(':repository') {
        dependencies {
            compile project(':model')
        }
    }

    project(':web') {
        apply plugin: 'war'
        apply plugin: 'jetty'

        repositories {
            mavenCentral()
        }

        dependencies {
            compile project(':repository')
            providedCompile 'javax.servlet:servlet-api:2.5'
            runtime 'javax.servlet:jstl:1.1.2'
        }
    }