Gradle學習系列之七——依賴管理
請通過以下方式下載本系列文章的Github示例程式碼:
一個Java專案總會依賴於第三方,要麼是一個第三方類庫,比如Apache commons;要麼是你自己開發的另外一個Java專案,比如你的web專案依賴於另一個核心的業務專案。通常來說,這種依賴的表示形式都是將第三方的Jar檔案放在自己專案的classpath下,要麼是編譯時的classpath,要麼是執行時的classpath。
在宣告對第三方類庫的依賴時,我們需要告訴Gradle在什麼地方去獲取這些依賴,即配置Gradle的Repository。在配置好依賴之後,Gradle會自動地下載這些依賴到本地。Gradle可以使用Maven和Ivy的Repository,同時它還可以使用本地檔案系統作為Repository。
在本文中,我們將以Maven的Repository為例進行講解,要配置Maven的Repository是非常簡單的,我們只需要在build.gradle檔案中加入以下程式碼即可:
repositories {
mavenCentral()
}
Gradle將對依賴進行分組,比如編譯Java時使用的是這組依賴,執行Java時又可以使用另一組依賴。每一組依賴稱為一個Configuration,在宣告依賴時,我們實際上是在設定不同的Configuration。值得一提的是,將依賴稱為Configuration並不是一個好的名字,更好的應該叫作諸如“DependencyGroup”之類的。但是,習慣了就好的。
要定義一個Configuration,我們可以通過以下方式完成:
configurations {
myDependency
}
以上只是定義了一個名為myDependency的Configuration,我們並未向其中加入依賴。我們可以通過dependencies()方法向myDependency中加入實際的依賴項:
dependencies {
myDependency 'org.apache.commons:commons-lang3:3.0'
}
以上,我們將Apache的commons加入了myDependency中。之後,如果有Task需要將Apache commons加入到classpath中,我們可以通過以下方式進行獲取:
task showMyDependency << {
println configurations.myDependency.asPath
}
執行“gradle showMyDependency”命令,在筆者的電腦上終端將顯示:
:showMyDependency
/Users/twer/.gradle/caches/artifacts-26/filestore/org.apache.commons/commons-lang3/3.0/jar/8873bd0bb5cb9ee37f1b04578eb7e26fcdd44cb0/commons-lang3-3.0.jar
BUILD SUCCESSFUL
Total time: 4.405 secs
在實際應用時,比如我們需要呼叫Ant的某個target,而該target在執行時需要設定classpath,那麼我們便可以通過以上方式進行設定。
下面,我們來看一個Java專案,該專案依賴於SLF4J,而在測試時依賴於Junit。在宣告依賴時,我們可以通過以下方式進行設定:
dependencies {
compile 'org.slf4j:slf4j-log4j12:1.7.2' testCompile 'junit:junit:4.8.2'
}
我們並沒有定義名為compile和testCompile的Configuration,這是這麼回事呢?原因在於,java Plugin會自動定義compile和testCompile,分別用於編譯Java原始檔和編譯Java測試原始檔。
另外,java Plugin還定義了runtime和testRuntime這兩個Configuration,分別用於在程式執行和測試執行時加入所配置的依賴。
再舉個來自Gradle官網的例子:在Gradle中呼叫Ant,首先我們通過Configuration宣告一組依賴,然後在Ant定義中將該Configuration所表示的classpath傳給Ant:
configurations {
pmd
}
dependencies {
pmd group: 'pmd', name: 'pmd', version: '4.2.5'
}
task check << {
ant.taskdef(name: 'pmd', classname: 'net.sourceforge.pmd.ant.PMDTask', classpath: configurations.pmd.asPath)
ant.pmd(shortFilenames: 'true', failonruleviolation: 'true', rulesetfiles: file('pmd-rules.xml').toURI().toString()) {
formatter(type: 'text', toConsole: 'true')
fileset(dir: 'src')
}
}
如果存在依賴衝突,在預設情況下,Gradle會選擇最新版本,這和Maven是不同的,Maven會選擇離依賴樹最近的版本。當然,我們可以通過設定Configuration的resolutionStrategy來
重新設定依賴衝突的處理規則,對此本文將不予講解。
除了可以加入Maven和Ivy的Repository中的依賴之外,Gradle還允許我們宣告對其他Project或者檔案系統的依賴。比如,如果ProjectA的compileJava依賴於ProjectB,那麼可以在ProjectA中宣告如下:
dependencies { compile project(':ProjectB')}
在下一篇文章中,我們將對此再做講解。另外,對於本地檔案系統中的Jar檔案,我們可以通過以下方式宣告對其的依賴:
dependencies {
compile files('spring-core.jar', 'spring-aap.jar')
compile fileTree(dir: 'deps', include: '*.jar')
}
轉自:http://www.davenkin.me/post/2013-11-12/gradle-dependency-management