在本系列的上篇文章中,我們講到了如何使用java Plugin,在本篇文章中,我們將講到Gradle的依賴管理。
請通過以下方式下載本系列文章的Github示例代碼:
git clone https://github.com/davenkin/gradle-learning.git
一個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') }