本章節(jié)介紹如何使用 Gradle 進(jìn)行基本的依賴(lài)管理.
通俗來(lái)講,依賴(lài)管理由如下兩部分組成。首先,Gradle 需要知道項(xiàng)目構(gòu)建或運(yùn)行所需要的一些文件,以便于找到這些需要的文件。我們稱(chēng)這些輸入的文件為項(xiàng)目的依賴(lài)。其次,你可能需要構(gòu)建完成后自動(dòng)上傳到某個(gè)地方。我們稱(chēng)這些輸出為發(fā)布。下面來(lái)仔細(xì)介紹一下這兩部分:
大部分工程都不太可能完全自給自足,一般你都會(huì)用到其他工程的文件。比如我工程需要 Hibernate 就得把它的類(lèi)庫(kù)加進(jìn)來(lái),比如測(cè)試的時(shí)候可能需要某些額外 jar 包,例如 JDBC 驅(qū)動(dòng)或 Ehcache 之類(lèi)的 Jar 包。
這些文件就是工程的依賴(lài)。Gradle 需要你告訴它工程的依賴(lài)是什么,它們?cè)谀模缓髱湍慵尤霕?gòu)建中。依賴(lài)可能需要去遠(yuǎn)程庫(kù)下載,比如 Maven 或者 Ivy 庫(kù)。也可以是本地庫(kù),甚至可能是另一個(gè)工程。我們稱(chēng)這個(gè)過(guò)程叫依賴(lài)解決。
通常,依賴(lài)的自身也有依賴(lài)。例如,Hibernate 核心類(lèi)庫(kù)就依賴(lài)于一些其他的類(lèi)庫(kù)。所以,當(dāng) Gradle 構(gòu)建你的工程時(shí),會(huì)去找到這些依賴(lài)。我們稱(chēng)之為依賴(lài)傳遞。
大部分工程構(gòu)建的主要目的是脫離工程使用。例如,生成 jar 包,包括源代碼、文檔等,然后發(fā)布出去。
這些輸出的文件構(gòu)成了項(xiàng)目的發(fā)布內(nèi)容。Gralde 也會(huì)為你分擔(dān)這些工作。你聲明了發(fā)布到到哪,Gradle 就會(huì)發(fā)布到哪?!鞍l(fā)布”的意思就是你想做什么。比如,復(fù)制到某個(gè)目錄,上傳到 Maven 或 Ivy 倉(cāng)庫(kù)。或者在其它項(xiàng)目里使用,這些都可以稱(chēng)之為發(fā)行。
來(lái)看一下這個(gè)腳本里聲明依賴(lài)的部分:
build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
這是什么意思呢?這段腳本是這么個(gè)意思。首先,Hibernate-core.3.6.7.final.jar 這貨是編譯期必需的依賴(lài)。并且這貨相關(guān)的依賴(lài)也會(huì)一并被加載進(jìn)來(lái),該段腳本同時(shí)還聲明項(xiàng)目測(cè)試階段需要 4.0 版本以上的 Junit。同時(shí)告訴 Gradle 可以去 Maven 中央倉(cāng)庫(kù)去找這些依賴(lài)。下面的章節(jié)會(huì)進(jìn)行更詳細(xì)的描述。
Gradle 中依賴(lài)以組的形式來(lái)劃分不同的配置。每個(gè)配置都只是一組指定的依賴(lài)。我們稱(chēng)之為依賴(lài)配置 。你也可以借由此聲明外部依賴(lài)。后面我們會(huì)了解到,這也可用用來(lái)聲明項(xiàng)目的發(fā)布。
Java 插件定義了許多標(biāo)準(zhǔn)配置項(xiàng)。這些配置項(xiàng)形成了插件本身的 classpath。比如下面羅列的這一些,并且你可以從 “Java 插件 - 依賴(lài)配置”了解到更多詳細(xì)內(nèi)容.。
編譯范圍依賴(lài)在所有的 classpath 中可用,同時(shí)它們也會(huì)被打包
runtime 依賴(lài)在運(yùn)行和測(cè)試系統(tǒng)的時(shí)候需要,但在編譯的時(shí)候不需要。比如,你可能在編譯的時(shí)候只需要 JDBC API JAR,而只有在運(yùn)行的時(shí)候才需要 JDBC 驅(qū)動(dòng)實(shí)現(xiàn)
測(cè)試期編譯需要的附加依賴(lài)
測(cè)試運(yùn)行期需要
不同的插件提供了不同的標(biāo)準(zhǔn)配置,你甚至也可以定義屬于自己的配置項(xiàng)。
依賴(lài)的類(lèi)型有很多種,其中有一種類(lèi)型稱(chēng)之為外部依賴(lài)。這種依賴(lài)由外部構(gòu)建或者在不同的倉(cāng)庫(kù)中,例如 Maven 中央倉(cāng)庫(kù)或 Ivy 倉(cāng)庫(kù)中抑或是本地文件系統(tǒng)的某個(gè)目錄中。
定義外部依賴(lài)需要像下面這樣進(jìn)行依賴(lài)配置
build.gradle
dependencies {
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
}
外部依賴(lài)包含 group,name 和 version 幾個(gè)屬性。根據(jù)選取倉(cāng)庫(kù)的不同,group 和 version 也可能是可選的。
當(dāng)然,也有一種更加簡(jiǎn)潔的方式來(lái)聲明外部依賴(lài)。采用:將三個(gè)屬性拼接在一起即可。"group:name:version"
build.gradle
dependencies {
compile 'org.hibernate:hibernate-core:3.6.7.Final'
}
Gradle 是在一個(gè)被稱(chēng)之為倉(cāng)庫(kù)的地方找尋所需的外部依賴(lài)。倉(cāng)庫(kù)即是一個(gè)按 group,name 和 version 規(guī)則進(jìn)行存儲(chǔ)的一些文件。Gradle 可以支持不同的倉(cāng)庫(kù)存儲(chǔ)格式,如 Maven 和 Ivy,并且還提供多種與倉(cāng)庫(kù)進(jìn)行通信的方式,如通過(guò)本地文件系統(tǒng)或 HTTP。
默認(rèn)情況下,Gradle 沒(méi)有定義任何倉(cāng)庫(kù),你需要在使用外部依賴(lài)之前至少定義一個(gè)倉(cāng)庫(kù),例如 Maven 中央倉(cāng)庫(kù)。
build.gradle
repositories {
mavenCentral()
}
或者其它遠(yuǎn)程 Maven 倉(cāng)庫(kù):
build.gradle
repositories {
maven {
url "http://repo.mycompany.com/maven2"
}
}
或者采用 Ivy 遠(yuǎn)程倉(cāng)庫(kù)
build.gradle
repositories {
ivy {
url "http://repo.mycompany.com/repo"
}
}
或者在指定本地文件系統(tǒng)構(gòu)建的庫(kù)。
build.gradle
repositories {
ivy {
// URL can refer to a local directory
url "../local-repo"
}
}
一個(gè)項(xiàng)目可以采用多個(gè)庫(kù)。Gradle 會(huì)按照順序從各個(gè)庫(kù)里尋找所需的依賴(lài)文件,并且一旦找到第一個(gè)便停止搜索。
了解更多庫(kù)相關(guān)的信息請(qǐng)參閱章節(jié) 50.6,“倉(cāng)庫(kù)”。
依賴(lài)配置也被用于發(fā)布文件[3]我們稱(chēng)之為打包發(fā)布或發(fā)布。
插件對(duì)于打包提供了完美的支持,所以通常而言無(wú)需特別告訴 Gradle 需要做什么。但是你需要告訴 Gradle 發(fā)布到哪里。這就需要在 uploadArchives 任務(wù)中添加一個(gè)倉(cāng)庫(kù)。下面的例子是如何發(fā)布到遠(yuǎn)程 Ivy 倉(cāng)庫(kù)的:
build.gradle
uploadArchives {
repositories {
ivy {
credentials {
username "username"
password "pw"
}
url "http://repo.mycompany.com"
}
}
}
執(zhí)行 gradle uploadArchives,Gradle 便會(huì)構(gòu)建并上傳你的 jar 包,同時(shí)會(huì)生成一個(gè) ivy.xml 一起上傳到目標(biāo)倉(cāng)庫(kù)。
當(dāng)然你也可以發(fā)布到 Maven 倉(cāng)庫(kù)中。語(yǔ)法只需稍微一換就可以了。[4]
p.s:發(fā)布到 Maven 倉(cāng)庫(kù)你需要 Maven 插件的支持,當(dāng)然,Gradle 也會(huì)同時(shí)產(chǎn)生 pom.xml 一起上傳到目標(biāo)倉(cāng)庫(kù)。
build.gradle
apply plugin: 'maven'
uploadArchives {
repositories {
mavenDeployer {
repository(url: "file://localhost/tmp/myRepo/")
}
}
}
若對(duì) DSL 感興趣,請(qǐng)看 Project.configurations{},Project.repositories{} 和 Project.dependencies{}。
更多建議: