Java Gradle入門指南之依賴管理(添加依賴、倉庫、版本衝突)

推薦閱讀

Pandas 數據處理(三) - Cheat Sheet 中文版 pdf
Pandas 數據處理(二) - 篩選數據
Pandas 數據處理(一) - DataFrame 與 Serieshtml

0.前言

    開發任何軟件,如何管理依賴是一道繞不過去的坎,軟件開發過程當中,咱們每每會使用這樣那樣的第三方庫,這個時候,一個好的依賴管理就顯得尤其重要了。做爲一個自動構建工做,Gradle對依賴管理有着很好的支持。
    一般咱們使用IDE(Eclipse、IDEA、Android Studio)開發Java項目,IDE自動爲咱們建立了Gradle文件,添加依賴也不過簡單的幾行代碼,這篇隨筆將從逐步解釋Gradle的依賴管理方法,但願對你們有所幫助。
    若有錯誤,請不吝指出,很是感謝!若是本文對你有幫助,右下角點個推薦吧~java

1.添加依賴包名

1.1 依賴類型

  • 常見的依賴包含兩種類型。android

    (1) 一類是項目中所須要的庫,包括本地/倉庫中的文件和其餘項目文件(例如一個多項目工程,一個項目依賴於另外一個項目)

    (2) 一類是實現自動化編譯、部署等所需的庫,包含Gradle的API和Groovy編寫的Task、Plugin等,這一類依賴在前2篇隨筆有提到和使用git

1.2 聲明依賴

  • 聲明依賴使用下面的閉包
dependencies {
    <configuration name> <dependencies>
}

1.3 添加java依賴

  • 在這裏,咱們以構建java項目爲例,構建java項目首先須要應用java插件,插件的使用可參考上一篇隨筆Java Gradle之插件管理github

  • java插件針對不一樣操做,將依賴分爲10類(詳見 java plugin 45.5),下面介紹經常使用的5類spring

    (1) compile:源代碼(src/main/java)編譯時的依賴,最經常使用
    (2) runtime:源代碼(src/main/java)執行時依賴
    (3) testCompile:測試代碼(src/main/test)編譯時的依賴
    (4) testRuntime:測試代碼(src/main/java)執行時的依賴

    (5) archives:項目打包(e.g.jar)時的依賴
    數組

  • 一般,一個JAR依賴需包含JAR文件組(group/命名空間)、JAR文件名(name)、JAR文件版本(version),特殊狀況下還可指定JDK版本。添加依賴能夠有如下方式:緩存

/* 單個依賴 */
compile group:'log4j', name:'log4j', version:'1.2.17'
// 簡寫 => compile 'log4j:log4j:1.2.17'

/* 以數組形式添加多個依賴*/
compile 'joda-time:joda-time:2.9.2', 'log4j:log4j:1.2.17'

/* 閉包形式,以添加額外配置*/
compile (group:'log4j', name:'log4j', version:'1.2.17'){
    // ... 額外配置
}
/* 等價於 */
compile ('log4j:log4j:1.2.17'){
    // ... 額外配置
}

1.4 查找依賴包名

  • 點擊maven網站
  • 搜索須要導入的包,例如gson,點擊對應版本,例如2.6.2
  • 選擇gradle,將會出現'com.google.code.gson:gson:2.6.2'
  • 複製 & 粘貼

1.5 完整的例子

// sourceCompatibility = 1.8爲java版本,默認爲當前JVM版本
apply plugin: 'java'

sourceCompatibility = 1.8
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.springframework:spring-context:4.2.1.RELEASE'
    compile 'log4j:log4j:1.2.17'
}
  • repositories{ ... } 是放置這些包的倉庫,接下來介紹
  • sourceCompatibility、version只是java plugin的部分屬性,更多請看 java plugin 45.8

2.添加依賴倉庫

    你可能會疑惑,聲明瞭這些依賴,這些依賴是在哪裏找到的呢?repositories定義了下載依賴的倉庫閉包

/* Maven Central respoitory */
repositories {
    mavenCentral()
}
/* Maven JCenter respoitory */
repositories {
    jcenter()
}
/* Maven local respoitory */
/* 本地倉庫是以前下載的依賴,緩存在本地磁盤*/
repositories {
    mavenLocal() 
}
  • 不須要記住倉庫的地址,直接使用便可,多個倉庫能夠同時用,一般咱們會將遠程倉庫與本地倉庫一塊兒使用,由於緩存在本地磁盤上的文件速度更快,不須要重複下載。
  • 關於jcentermavenCentral的區別,推薦看stackoverflow的回答
  • 固然,國外的倉庫在國內使用速度可能會比較慢,Gradle支持自定義地址,例如公司的倉庫地址、國內倉庫鏡像地址等。
repositories {
    mavenLocal() 
    /* 指定本地倉庫地址 */
    maven { url "file://E:/githubrepo/releases" }
    /* 指定的遠程倉庫 */
    maven { url "http://mvnrepository.com/" }
    /* 
     * 公司倉庫,可能須要驗證
     * 不推薦直接將用戶名密碼寫在build.gradle中
     * 能夠寫在~/.gradle/gradle.properties中,再使用
     */
    maven {
        url "<you_company_resp_url>"
        credentials {
            username 'your_username'
            password 'your_password'
        }
    }
    // 支持ivy倉庫
    ivy { url "<ivy_resp_url>" }
}
  • 有時,咱們須要調用本身編譯實現的*.jar,咱們也能夠將包含這些文件的文件夾(不一樣於mavenLocal)映射爲一個倉庫,但通常不推薦這樣作
repositories {
    flatDir {  dirs 'libs1/java/...','libs2' }
}

3.依賴常見問題

3.1 依賴傳遞性

  • 不少庫依賴於其餘庫,例如a.jar依賴b.jar,在Gradle中,只需添加a.jar便可,Gradle將自動把a依賴的全部庫所有下載。
  • 可是,有時你並不想讓Gradle自動去作這件事情,好比你但願明明白白地知道添加哪些庫,能夠配置transitive實現,編譯時報錯,你就能夠知道進一步需添加哪些庫。
dependencies {
    // transitive 屬性默認爲 true
    compile group:'log4j',name:'log4j',version:'1.2.17',transitive:false
}
  • 另外一種狀況是,依賴傳遞可能會致使版本衝突,即依賴傳遞下載的庫可能與項目依賴的另外一個庫版本衝突,這種狀況下能夠排除一些庫,而下載其餘全部的依賴庫,即選擇性排除。
dependencies {
    compile ('commons-httpclient:commons-httpclient:3.1'){
        exclude group:'commons-codec' //排除該group的依賴
        // exclude group:'commons-codec',module:'commons-codec'
        // group是必選項,module可選
    }
}

3.2 版本衝突

  • 版本衝突時十分常見的,好比下面的例子
// 庫 a 傳遞性依賴庫 b-1.2,與添加的b-1.1衝突
dependencies {
    compile 'a:a:1.0'
    compile 'b:b:1.1'
}
  • Gradle解決衝突有如下幾種方式app

    (1) 最近版本策略(默認):上例將忽略b-1.1,而下載b-1.2
    (2) 衝突失敗策略:發生衝突時,編譯失敗(有些新版本庫並不兼容以前的,所以這個庫可讓開發者主動做出選擇)

    (3) 強制指定版本策略:發生衝突時,使用開發者指定的版本

/* 衝突失敗策略設置*/
configurations.all {
    resolutionStrategy {  failOnVersionConflict() }
}
/* 強制指定版本策略設置*/
dependencies {
    compile group:'b',name:'b',version:'1.1',force:true
}

3.3 動態依賴

  • 動態依賴增長了庫版本依賴時的靈活性
dependencies {
    /* 選擇1以上任意一個版本,這使發生版本衝突的概率變小*/
    compile group:'b',name:'b',version:'1.+'
    /* 選擇最新的版本,避免直接指定版本號 */
    compile group:'a',name:'a',version:'latest.integration'
}

3.4 更多設置

  • 指定庫文件類型
// ext 默認jar,可選屬性爲war、zip
compile group:'b',name:'b',version:'1.1',ext:'war'
  • 使用分類器(classifiers)
// 例如提供了2種包,a-1.0-dev.war, a-1.0-dev.jar
compile group:'b',name:'b',version:'1.1',classifier:'dev',ext:'war'
  • 替換傳遞依賴的版本
compile group:'a',name:'a',version:'l.0' {
    dependencies 'b:b:1.1'
}
  • 經常使用命令
(1) 查看全部依賴庫
gradle dependencies
(2) 查看指定配置(詳見 1.3)的依賴庫
gradle dependencies -configuration <configuration>
例 gradle dependencies -configuration compile => 查看編譯時依賴
例 gradle dependencies -configuration runtime => 查看運行時依賴

    分享建立價值,歡迎關注&留言~

相關文章
相關標籤/搜索