鍍金池/ 教程/ 物聯(lián)網(wǎng)/ 聲明依賴
依賴管理實戰(zhàn)
配置遠程倉庫
安裝Gradle
簡介
項目自動化簡介
配置子項目
Gradle強大的特性
自動化測試
簡介
掌握構(gòu)建生命周期
使用命令行操作
構(gòu)建Java項目
管理任務(wù)
構(gòu)建工具
連續(xù)傳遞的特性
用Gradle開發(fā)Web項目
聲明依賴
構(gòu)建塊
簡介
測試Java應(yīng)用
java構(gòu)建工具
為什么選擇Gradle
拆分項目文件
單元測試
多項目打包
Gradle 起步
介紹這個Gradle項目
簡介
自定義腳本
Gradle包裝器
簡要概述依賴管理
項目模塊化

聲明依賴

DSL配置block dependencies用來給配置添加一個或多個依賴,你的項目不僅可以添加外部依賴,下面這張表顯示了Gradle支持的各種不同類型的依賴。

http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-3.png" alt="" />

這一章直接掃外部模塊依賴和文件依賴,我們來看看Gradle APi是怎么表示依賴的。

理解依賴的API表示

每個Gradle項目都有一個DependencyHandler的實例,你可以通過getDependencies()方法來獲取依賴處理器的引用,上表中每一種依賴類型在依賴處理器中都有一個相對應(yīng)的方法。每一個依賴都是Dependency的一個實例,group, name, version, 和classifier這幾個屬性用來標(biāo)識一個依賴,下圖清晰的表示了項目(Project)、依賴處理器(DependencyHandler)和依賴三者之間的關(guān)系:

http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-4.png" alt="" />

外部模塊依賴

在Gradle的術(shù)語里,外部庫通常是以JAR文件的形式存在,稱之為外部模塊依賴,代表項目層次外的一個模塊,這種類型的依賴是通過屬性來唯一的標(biāo)識,接下來我們來介紹每個屬性的作用。

依賴屬性

當(dāng)依賴管理器從倉庫中查找依賴時,需要通過屬性的結(jié)合來定位,最少需要提供一個name。

  • group: 這個屬性用來標(biāo)識一個組織、公司或者項目,可以用點號分隔,Hibernate的group是org.hibernate。
  • name: name屬性唯一的描述了這個依賴,hibernate的核心庫名稱是hibernate-core。
  • version: 一個庫可以有很多個版本,通常會包含一個主版本號和次版本號,比如Hibernate核心庫3.6.3-Final。
  • classifier: 有時候需要另外一個屬性來進一步的說明,比如說明運行時的環(huán)境,Hibernate核心庫沒有提供classifier。

依賴的寫法

你可以使用下面的語法在項目中聲明依賴:

    dependencies {
        configurationName dependencyNotation1,  dependencyNotation2, ...
    }

你先聲明你要給哪個配置添加依賴,然后添加依賴列表,你可以用map的形式來注明,你也可以直接用冒號來分隔屬性,比如這樣的:

http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-5.png" alt="" />

    //聲明外部屬性
    ext.cargoGroup = 'org.codehaus.cargo'
    ext.cargoVersion = '1.3.1'

    dependencies {
        //使用映射聲明依賴
        compile group: cargoGroup, name: 'cargo-core-uberjar',version: cargoVersion
        //用快捷方式來聲明,引用了前面定義的外部屬性
        cargo "$cargoGroup:cargo-ant:$cargoVersion"
    }

如果你項目中依賴比較多,你把一些共同的依賴屬性定義成外部屬性可以簡化build腳本。

Gradle沒有給項目選擇默認的倉庫,當(dāng)你沒有配置倉庫的時候運行deployTOLocalTomcat任務(wù)的時候回出現(xiàn)如下的錯誤:

    $ gradle deployToLocalTomcat
    :deployToLocalTomcat FAILED
    FAILURE: Build failed with an exception.

    Where: Build file '/Users/benjamin/gradle-in-action/code/chapter5/cargo-configuration/build.gradle' line: 10

    What went wrong:
    Execution failed for task ':deployToLocalTomcat'.
    > Could not resolve all dependencies for configuration ':cargo'.
        > Could not find group:org.codehaus.cargo, module:cargo-core-uberjar, version:1.3.1.
        Required by:
            :cargo-configuration:unspecified
    > Could not find group:org.codehaus.cargo, module:cargo-ant,version:1.3.1.
        Required by:
        :cargo-configuration:unspecified

到目前為止還沒講到怎么配置不同類型的倉庫,比如你想使用MavenCentral倉庫,添加下面的配置代碼到你的build腳本中:

    repositories {
        mavenCentral()
    }

檢查依賴報告

當(dāng)你運行dependencies任務(wù)時,這個依賴樹會打印出來,依賴樹顯示了你build腳本聲明的頂級依賴和它們的傳遞依賴:

http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-6.png" alt="" /> http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-7.png" alt="" />

仔細觀察你會發(fā)現(xiàn)有些傳遞依賴標(biāo)注了*號,表示這個依賴被忽略了,這是因為其他頂級依賴中也依賴了這個傳遞的依賴,Gradle會自動分析下載最合適的依賴。

排除傳遞依賴

Gradle允許你完全控制傳遞依賴,你可以選擇排除全部的傳遞依賴也可以排除指定的依賴,假設(shè)你不想使用UberJar傳遞的xml-api的版本而想聲明一個不同版本,你可以使用exclude方法來排除它:

    dependencies {
        cargo('org.codehaus.cargo:cargo-ant:1.3.1') {
            exclude group: 'xml-apis', module: 'xml-apis'
        }
        cargo 'xml-apis:xml-apis:2.0.2'
    }

exclude屬性值和正常的依賴聲明不太一樣,你只需要聲明group和(或)module,Gradle不允許你只排除指定版本的依賴。

有時候倉庫中找不到項目依賴的傳遞依賴,這會導(dǎo)致構(gòu)建失敗,Gradle允許你使用transitive屬性來排除所有的傳遞依賴:

    dependencies {
        cargo('org.codehaus.cargo:cargo-ant:1.3.1') {
        transitive = false
        }
        // 選擇性的聲明一些需要的庫
    }

動態(tài)版本聲明

如果你想使用一個依賴的最新版本,你可以使用latest.integration,比如聲明 Cargo Ant tasks的最新版本,你可以這樣寫 org.codehaus .cargo:cargo-ant:latest-integration,你也可以用一個+號來動態(tài)的聲明:

    dependencies {
        //依賴最新的1.x版本
        cargo 'org.codehaus.cargo:cargo-ant:1.+'
    }

Gradle的dependencies任務(wù)可以清晰的看到選擇了哪個版本,這里選擇了1.3.1版本:

    $ gradle –q dependencies
    ------------------------------------------------------------
    Root project
    ------------------------------------------------------------
    Listing 5.4 Excluding a single dependency
    Listing 5.5 Excluding all transitive dependencies
    Listing 5.6 Declaring a dependency on the latest Cargo 1.x version
    Exclusions can be
    declared in a shortcut
    or map notation.
    120 CHAPTER 5 Dependency management
    cargo - Classpath for Cargo Ant tasks.
    \--- org.codehaus.cargo:cargo-ant:1.+ -> 1.3.1
    \--- ...

文件依賴

如果你沒有使用自動的依賴管理工具,你可能會把外部庫作為源代碼的一部分或者保存在本地文件系統(tǒng)中,當(dāng)你想把項目遷移到Gradle的時候,你不想去重構(gòu),Gradle很簡單就能配置文件依賴。下面這段代碼復(fù)制從Maven中央倉庫解析的依賴到libs/cargo目錄。

    task copyDependenciesToLocalDir(type: Copy) {
        //Gradle提供的語法糖
        from configurations.cargo.asFileTree
        into "${System.properties['user.home']}/libs/cargo"
    }

運行這個任務(wù)之后你就可以在依賴中聲明Cargo庫了,下面這段代碼展示了怎么給cargo配置添加JAR文件依賴:

    dependencies {
        cargo fileTree(dir: "${System.properties['user.home']}/libs/cargo",include: '*.jar')
    }