1. 程式人生 > >Gradle多模組的專案構建

Gradle多模組的專案構建

示例程式擁有兩個模組:
     core模組包含一些通用的元件,它們能夠被程式的其他模組使用。例子中,只包含一個類:MessageService類返回‘Hello World!’字串。該模組有兩個依賴:Junit 4.11與commons-lang3。
     app模組包含HelloWorld類,是程式的開端,它從MessageService物件中獲取資訊,並將接收到的資訊寫入一個日誌檔案中。該模組擁有兩個依賴:它需要core模組,還使用Log4j作為日誌。

下面,我們將建立一個多專案的Gradle構建,包括兩個子專案:app 和 core。首先肯定是建立專案multiproject根目錄。

1.在根目錄下建立模組的目錄並配置build.gradle檔案

首先需要建立兩個模組對應的目錄:app、core。分別在對應的目錄建立build.gradle檔案並配置:
apply plugin: 'java'

repositories {
    mavenCentral()
}

task "mkdirs" << {
    sourceSets*.java.srcDirs*.each { it.mkdirs() }
    sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}
分別執行gradle mkdirs任務會自動建立好src目錄。

2.對包含在多專案構建中的專案進行配置
可以通過以下步驟,對包含在多專案構建中的專案進行配置:在根專案的根目錄下建立settings.gradle檔案,它指明瞭那些包含在多專案構建中的專案。
settings.gradle配置如下:
rootProject.name = 'multiproject'
include 'app','core'

3.配置core模組的build.gradle
apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.apache.commons:commons-lang3:3.4'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

task "mkdirs" << {
    sourceSets*.java.srcDirs*.each { it.mkdirs() }
    sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

4.配置app模組的build.gradle
首先先說下,如果多專案構建擁有專案A和B,同時,專案B的編譯需要專案A,可以通過在專案B的build.gradle檔案中新增以下依賴宣告來進行依賴配置。dependencies { compile project(:A)}
故app專案的build.gradle檔案如下:
apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'log4j:log4j:1.2.17'
    compile project(':core')
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

jar {
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }

    manifest {
        attributes 'Main-Class': 'org.zero.HelloWorld'
    }
}
直接執行任務gradle build,在app目錄下build/libs/會生成app.jar的可執行的jar檔案,java –jar app.jar即可執行app程式。

5.移除重複配置
當對多專案構建中的子專案進行配置時,在core和app專案的構建指令碼中添加了重複的配置。都使用Java外掛、都使用Maven2中央倉庫等。
可以將這項配置轉移到根專案的build.gradle檔案中,在此之前,必須先學習一下如何在根專案的build.gradle檔案中配置子專案。
 如果想要在一個稱為core的子專案中新增配置,那麼就必須在根專案的build.gradle檔案中新增以下片段:
project(:core) {
       //Add core specific configuration here
}
換句話說,如果想要將重複的配置轉移到根專案的構建指令碼中,就必須將以下配置新增到build.gradle檔案中:
project(:app) {
	apply plugin: java;
	repositories {
		mavenCentral()
	}
}

project(:core) {
	apply plugin: java;
	repositories {
		mavenCentral()
	}
}
不過這種做法在實質上並沒有改變什麼,在構建指令碼中依然還存在重複配置,唯一的區別是重複配置現在轉移到了根專案的build.gradle檔案中。
如果想要在根專案的子專案中新增通用的配置,需要將以下片段新增到根專案的build.gradle檔案中:
subprojects {
	//Add common configuration here
}
於是在根專案的build.gradle檔案可以這樣修改:
subprojects {
    apply plugin: 'java'

    repositories {
        mavenCentral()
    }
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.11'
    }

    task "mkdirs" << {
        sourceSets*.java.srcDirs*.each { it.mkdirs() }
        sourceSets*.resources.srcDirs*.each { it.mkdirs() }
    }
}
此時app、core會擁有同subprojects內容一樣的配置。

如果配置項是被多專案構建中的所有專案所共享的,那麼也可以在根專案的build.gradle檔案中新增以下片段:
allprojects {
	//Add configuration here
}

參考:http://blog.jobbole.com/84471/