1. 程式人生 > >Gradle學習系列之七——依賴管理

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