Gradle學習系列之七——依賴管理


  在本系列上篇文章中,我們講到了如何使用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') }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM