Gradle介紹和下載

1 Gradle

1.1 介紹

gradlemaven一樣都是用來構(gòu)建java程序的夯巷,maven2004年開始興起探赫,gradle2012年開始誕生痢艺,既然已經(jīng)有了maven這么成熟的構(gòu)建工具為什么還有gradle的誕生呢店量,因為gradle有很多地方比maven做的更好翘紊,例如gradle采用groovy語言開發(fā)余佃,語法更加簡單暮刃,例如maven一個配置需要三行,而gradle只需要一行即可

Gradle是繼Maven之后的新一代構(gòu)建工具爆土,它采用基于groovyDSL語言作為腳本椭懊,相比傳統(tǒng)構(gòu)建工具通過XML來配置而言,最直觀上的感受就是腳本更加的簡潔、優(yōu)雅氧猬。如果之前對Maven有所了解背犯,那么可以很輕易的轉(zhuǎn)換到Gradle,它采用了同Maven一致的目錄結(jié)構(gòu)盅抚,可以與Maven一樣使用Maven中央倉庫以及各類倉庫的資源漠魏,并且Gradle默認(rèn)也內(nèi)置了腳本轉(zhuǎn)換命令可以方便的將POM轉(zhuǎn)換為gradle.build

1.2 優(yōu)勢

  • 依賴管理:即將項目中的jar包管理起來,可以使用Maven或者Ivy的遠(yuǎn)程倉庫妄均、或者本地文件系統(tǒng)等
  • 編譯打包:可以通過腳本實現(xiàn)花樣打包柱锹,包括修改文件、添加抑或排除某些類或資源丰包、采用指定JDK版本構(gòu)建禁熏、打包后自動上傳等等等等
  • 多項目支持: Gradle對多項目有著良好的支持,比如一個很具有代表性的實踐就是spring framework
  • 多語言支持:無論是java邑彪、groovy瞧毙、scala、c++都有良好的支持
  • 跨平臺支持:gradle是基于jvm的寄症,只要有jvm就可以讓gradle運行
  • 靈活的的腳本:可以使用groovy靈活的編寫任務(wù)完成你想要做的任何事情

1.2.1 約定優(yōu)于配置

約定優(yōu)于配置(convention over configuration),簡單而言就是遵循一定的固定規(guī)則從而可以避免額外的配置宙彪。雖然這一定程度上降低了靈活性,但卻能減少重復(fù)的額外配置瘸爽,同時也可以幫助開發(fā)人員遵守一定的規(guī)則您访。當(dāng)然铅忿,約定并不是強制性約束剪决,Gradle提供了各種靈活的途徑可以更改默認(rèn)的配置

1.2.2 結(jié)構(gòu)

  1. 標(biāo)準(zhǔn)結(jié)構(gòu)
    Gradle遵循COC(convention over configuration約定優(yōu)于配置)的理念,默認(rèn)情況下提供了與maven相同的項目結(jié)構(gòu)配置
    大體結(jié)構(gòu)如下

project root
src/main/java(測試)
src/main/resources
src/test/java(測試源碼目錄)
src/test/resources(測試資源目錄)
src/main/webapp(web工程)

  1. 非標(biāo)準(zhǔn)結(jié)構(gòu)配置
    在一些老項目上,可能目錄結(jié)構(gòu)并不是標(biāo)準(zhǔn)結(jié)構(gòu),然而一般開發(fā)人員又不好進行結(jié)構(gòu)調(diào)整.此時可以通過配置sourceSet來指定目錄結(jié)構(gòu)
sourceSets {
    main {
        java {
            srcDir 'src/java'
        }
        resources {
            srcDir 'src/resources'
        }
    }
}

或者如下寫法:

sourceSets {
    main.java.srcDirs = ['src/java']
    main.resources.srcDirs = ['src/resources']
}
  1. 搭配include和exclude進行指定
sourceSets {
  main {
    java {
      //your java source paths and exclusions go here...
    }

    resources {
      srcDir 'main/resources'
      include '**/*.properties'
      include '**/*.png'


      srcDir 'src'
      include '**/Messages*.properties'
      exclude '**/*.java'
    }
  }
}

1.2.3 腳本

一個簡單的Gralde腳本,或許包含如下內(nèi)容,其中標(biāo)明可選的都是可以刪掉的部分:

  • 插件引入:聲明你所需的插件
  • 屬性定義(可選):定義擴展屬性
  • 局部變量(可選):定義局部變量
  • 屬性修改(可選):指定project自帶屬性
  • 倉庫定義:指明要從哪個倉庫下載jar包
  • 依賴聲明:聲明項目中需要哪些依賴
  • 自定義任務(wù)(可選):自定義一些任務(wù)
//定義擴展屬性(給腳本用的腳本)
buildScript {
    repositories {
         mavenCentral()
    }
}
//應(yīng)用插件,這里引入了Gradle的Java插件,此插件提供了Java構(gòu)建和測試所需的一切。
apply plugin: 'java'
//定義擴展屬性(可選)
ext {
    foo="foo"
}
//定義局部變量(可選)
def bar="bar"

//修改項目屬性(可選)
group 'pkaq'
version '1.0-SNAPSHOT'

//定義倉庫,當(dāng)然gradle也可以使用各maven庫 ivy庫 私服 
repositories {
    jcenter()
}

//定義依賴,這里采用了g:a:v簡寫方式,加號代表了最新版本(可選)
dependencies {
    compile "cn.pkaq:ptj.tiger:+"
}

//自定義任務(wù)(可選)
task printFoobar {
    println "${foo}__${bar}"
}

1.3 依賴管理

通常而言檀训,依賴管理包括兩部分柑潦,對依賴的管理以及發(fā)布物的管理;依賴是指構(gòu)建項目所需的構(gòu)件(jar包等)峻凫。例如渗鬼,對于一個應(yīng)用了spring普通的java web項目而言,spring相關(guān)jar包即項目所需的依賴荧琼。發(fā)布物譬胎,則是指項目產(chǎn)出的需要上傳的項目產(chǎn)物

1.3.1 采用變量統(tǒng)一控制版本號

dependencies {
    def bootVersion = "1.3.5.RELEASE"
    compile     "org.springframework.boot:spring-boot-starter-web:${bootVersion}",  
                "org.springframework.boot:spring-boot-starter-data-jpa:${bootVersion}",
                "org.springframework.boot:spring-boot-starter-tomcat:${bootVersion}"
}

1.3.2 自動獲取最新版本依賴

如果你想某個庫每次構(gòu)建時都檢查是否有新版本,那么可以采用+來讓Gradle在每次構(gòu)建時都檢查并應(yīng)用最新版本的依賴命锄。當(dāng)然也可以采用1.x,2.x的方式來獲取某個大版本下的最新版本堰乔。

dependencies {
    compile     "org.springframework.boot:spring-boot-starter-web:+"
}

1.3.3 依賴的坐標(biāo)

倉庫中構(gòu)件(jar包)的坐標(biāo)是由configurationName group:name:version:classifier@extension組成的字符串構(gòu)成,如同Maven中的GAV坐標(biāo)脐恩,Gradle可借由此來定位想搜尋的jar包镐侯。

在gradle中可以通過以下方式來聲明依賴:

testCompile group: 'junit', name: 'junit', version: '4.0'
項目 描述
configurationName 依賴的作用范圍
group 通常用來描述組織、公司驶冒、團隊或者其它有象征代表意義的名字苟翻,比如阿里就是com.alibaba韵卤,一個group下一般會有多個artifact
name 依賴的名稱,或者更直接來講叫包名崇猫、模塊沈条、構(gòu)件名、發(fā)布物名以及隨便怎么稱呼诅炉。druid就是com.alibaba下的一個連接池庫的名稱
version 見名知意拍鲤,無它,版本號
classifier 類庫版本汞扎,在前三項相同的情況下季稳,如果目標(biāo)依賴還存在對應(yīng)不同JDK版本的版本,可以通過此屬性指明
extension 依賴的歸檔類型澈魄,如aar景鼠、jar等,默認(rèn)不指定的話是jar

由于Gradle依賴配置支持多種書寫方式痹扇,采用map或者字符串

采用map描述依賴
testCompile group: 'junit', name: 'junit', version: '4.0'
采用字符串方式描述依賴
testCompile 'junit:junit:4.0'

顯然采用字符串的方式更加簡單直觀铛漓,當(dāng)然借助groovy語言強大的GString還可以對版本號進行抽離。如下面的示例鲫构,這里需要注意的是如果要用GString的話浓恶,依賴描述的字符串要用"雙引號"包起來才會生效。

def ver = "4.0"
testCompile "junit:junit:${ver}"

1.3.4 依賴的范圍

上面的例子中采用的testComplie是聲明依賴的作用范圍结笨,關(guān)于各種作用范圍的功效可見下表
這里需要注意的是,provided范圍內(nèi)的傳遞依賴也不會被打包

名稱 說明
compileOnly gradle2.12之后版本新添加的,2.12版本時期曾短暫的叫provided,后續(xù)版本已經(jīng)改成了compileOnly,由java插件提供,適用于編譯期需要而不需要打包的情況
providedCompile war插件提供的范圍類型:與compile作用類似,但不會被添加到最終的war包中這是由于編譯包晰、測試階段代碼需要依賴此類jar包,而運行階段容器已經(jīng)提供了相應(yīng)的支持炕吸,所以無需將這些文件打入到war包中了;例如Servlet API就是一個很明顯的例子.
api 3.4以后由java-library提供伐憾,當(dāng)其他模塊依賴于此模塊時,此模塊使用api聲明的依賴包是可以被其他模塊使用
implementation 3.4以后由java-library提供赫模,當(dāng)其他模塊依賴此模塊時树肃,此模塊使用implementation聲明的依賴包只限于模塊內(nèi)部使用,不允許其他模塊使用
compile 編譯范圍依賴在所有的classpath中可用瀑罗,同時它們也會被打包
providedRuntime 同proiveCompile類似
runtime runtime依賴在運行和測試系統(tǒng)的時候需要胸嘴,但在編譯的時候不需要。比如斩祭,你可能在編譯的時候只需要JDBC API JAR劣像,而只有在運行的時候才需要JDBC驅(qū)動實現(xiàn)。
testCompile 測試期編譯需要的附加依賴
testRuntime 測試運行期需要
archives -
default 配置默認(rèn)依賴范圍

1.3.5 依賴的分類

類型 描述
外部依賴 依賴存放于外部倉庫中,如jcenter ,mavenCentral等倉庫提供的依賴
項目依賴 依賴于其它項目(模塊)的依賴
文件依賴 依賴存放在本地文件系統(tǒng)中,基于本地文件系統(tǒng)獲取依賴
內(nèi)置依賴 跟隨Gradle發(fā)行包或者基于Gradle API的一些依賴,通常在插件開發(fā)時使用
子模塊依賴 -

1.3.5.1 外部依賴

可以通過如下方式聲明外部依賴停忿,Gradle支持通過map方式或者g:a:v的簡寫方式傳入依賴描述驾讲,這些聲明依賴會去配置的repository查找。

dependencies {
 // 采用map方式傳入單個
  compile group: 'commons-lang', name: 'commons-lang', version: '2.6'
 // 采用map方式傳入多個
  compile(
      [group: 'org.springframework', name: 'spring-core', version: '2.5'],
      [group: 'org.springframework', name: 'spring-aop', version: '2.5']
  )
  // 采用簡寫方式聲明
  compile 'org.projectlombok:lombok:1.16.10' 
  // 采用簡寫方式傳入多個 
  compile 'org.springframework:spring-core:2.5',
          'org.springframework:spring-aop:2.5'

}

1.3.5.2 項目依賴

此類依賴多見于多模塊項目,書寫方式如下吮铭,其中:是基于跟項目的相對路徑描述符时迫。

compile project(':project-foo')

1.3.5.3 文件依賴

依賴存在于本地文件系統(tǒng)中,舉個栗子谓晌,如oracleOJDBC驅(qū)動掠拳,中央倉庫中沒有又沒有自建私服此時需要放到項目lib下進行手工加載那么便可采用此種方式,可以通過FileCollection接口及其子接口提供的方法加載這些依賴(支持文件通配符)

dependencies {
   // 指定多個依賴
   compile files('hibernate.jar', 'libs/spring.jar')

   // 讀取lib文件夾下的全部文件作為項目依賴
   compile fileTree('libs')

   // 根據(jù)指定基準(zhǔn)目錄\包含\排除條件加載依賴
   compile fileTree(dir:'libs',include:'spring*.jar',exclude:'hibernate*.jar')
 }

1.3.5.4 內(nèi)置依賴

跟隨Gradle發(fā)行包或者基于Gradle API的一些依賴纸肉,通常在插件開發(fā)時使用溺欧,當(dāng)前提供了如下三種

 dependencies {
   // 加載Gradle自帶的groovy作為依賴
   compile localGroovy()

   // 使用Gradle API作為依賴
   compile gradleApi()

   /使用 Gradle test-kit API 作為依賴
   testCompile gradleTestKit()
 }

1.3.5.5 子模塊依賴

簡單來說就是聲明依賴的依賴或者依賴的傳遞依賴,一般情況下如果依賴的庫并未用構(gòu)建工具構(gòu)建(尤其是一些上古時代的老庫)柏肪,那么Gradle是無法透過源文件去查找該庫的傳遞性依賴的姐刁,通常而言,一個模塊采用XML(POM文件)來描述庫的元數(shù)據(jù)和它的傳遞性依賴烦味。Gradle可以借由此方式提供相同的能力聂使,當(dāng)然這種方式也會可以改寫原有的傳遞性依賴。這里讓druid連接池依賴了ptj.tiger的一個庫谬俄。

dependencies {
    // 讓ptj.tiger作為druid的傳遞性依賴
    compile module("com.alibaba:druid:1.0.26") {
            dependency("cn.pkaq:ptj.tiger:+")
    }

    runtime module("org.codehaus.groovy:groovy:2.4.7") {
        // 停用groovy依賴的commons-cli庫的依賴傳遞
        dependency("commons-cli:commons-cli:1.0") {
            transitive = false
        }
        // 讓groovy依賴的ant模塊的依賴ant-launcher停用傳遞性依賴并依賴ant-junit..........
        module(group: 'org.apache.ant', name: 'ant', version: '1.9.6') {
            dependencies "org.apache.ant:ant-launcher:1.9.6@jar",
                         "org.apache.ant:ant-junit:1.9.6"
        }
    }
 }

1.3.6 傳遞依賴

Maven倉庫中柏靶,構(gòu)件通過POM(一種XML文件)來描述相關(guān)信息以及傳遞性依賴。Gradle可以通過分析該文件獲取獲取所有依賴以及依賴的依賴和依賴的依賴的依賴溃论,為了更加直觀的表述屎蜓,可以通過下面的輸出 結(jié)果了解。

image.png

可以看到钥勋,我們的項目依賴了com.android.support-v4包炬转,然而com.android.support-v4包卻依賴了一眾support的全家桶,借助Gradle的傳遞性依賴特性笔诵,無需在腳本中把這些依賴都聲明一遍返吻,只需要簡單的一行,Gradle便會幫你將傳遞性依賴一起下載下來乎婿。

傳遞依賴特性可以輕松地通過transitive參數(shù)進行開啟或關(guān)閉,上面的示例中如果要忽略com.android.support-v4的傳遞性依賴可以采用指定 transitive = false 的方式來關(guān)閉依賴傳遞特性街佑,也可以采用添加@jar的方式忽略該依賴的所有傳遞性依賴谢翎。

 compile('com.android.support:support-v4:23.1.1'){
        transitive = false
 }

 compile 'com.android.support:support-v4:23.1.1'@jar

當(dāng)然,也可以全局性的關(guān)閉依賴的傳遞特性。

 configurations.all {
   transitive = false
}

1.3.7 排除依賴

有些時候可能需要排除一些傳遞性依賴中的某個模塊沐旨,此時便不能靠單純的關(guān)閉依賴傳遞特性來解決了森逮。這時exclude就該登場了,如果說@jar徹底的解決了傳遞問題磁携,那么exclude則是部分解決了傳遞問題褒侧。然而實際上exclude肯能還會用的頻率更更頻繁一些,比如下面幾種情況。

可以通過configuration配置或者在依賴聲明時添加exclude的方式來排除指定的引用闷供。
exclude可以接收groupmodule兩個參數(shù)烟央,這兩個參數(shù)可以單獨使用也可以搭配使用,具體理解如下:

compile('com.github.nanchen2251:CompressHelper:1.0.5'){
        //com.android.support:appcompat-v7:23.1.1
        exclude group: 'com.android.support'//排除組織依賴
        exclude module: 'appcompat-v7'//排除模塊依賴
        //或者如下
        exclude group: 'com.github.nanchen2251', module: 'CompressHelper'
 }

1.3.8 更新依賴

在執(zhí)行build歪脏、compile等任務(wù)時會解析項目配置的依賴并按照配置的倉庫去搜尋下載這些依賴疑俭。默認(rèn)情況下,Gradle會依照Gradle緩存->配置的倉庫的順序依次搜尋這些依賴婿失,并且一旦找到就會停止搜索钞艇。如果想要忽略本地緩存每次都進行遠(yuǎn)程檢索可以通過在執(zhí)行命令時添加--refresh-dependencies參數(shù)來強制刷新依賴。

gradle build --refresh-dependencies

當(dāng)遠(yuǎn)程倉庫上傳了相同版本依賴時豪硅,有時需要為緩存指定一個時效去檢查遠(yuǎn)程倉庫的依賴笨版本哩照,Gradle提供了cacheChangingModulesFor(int, java.util.concurrent.TimeUnit) ,cacheDynamicVersionsFor(int, java.util.concurrent.TimeUnit)兩個方法來設(shè)置緩存的時效

configurations.all {
    //每隔24小時檢查遠(yuǎn)程依賴是否存在更新
    resolutionStrategy.cacheChangingModulesFor 24, 'hours'
    //每隔10分鐘..
    //resolutionStrategy.cacheChangingModulesFor 10, 'minutes'
    // 采用動態(tài)版本聲明的依賴緩存10分鐘
    resolutionStrategy.cacheDynamicVersionsFor 10*60, 'seconds'
}

dependencies {
    // 添加changing: true
    compile group: "group", name: "module", version: "1.1-SNAPSHOT", changing: true
    //簡寫方式
    //compile('group:module:1.1-SNAPSHOT') { changing = true }
}

1.3.8.1 緩存位置管理

Gradle在按照配置的倉庫去搜尋下載依賴時,下載的依賴默認(rèn)會緩存到USER_HOME/.gradle/caches目錄下懒浮,當(dāng)然也可以手工修改這個位置葡秒。
具體可以參考如下三種方式:

  • 通過添加系統(tǒng)變量 GRADLE_USER_HOME
  • 設(shè)置虛擬機參數(shù) org.gradle.user.home 屬性
  • 通過命令行-g或者 --gradle-user-home 參數(shù)設(shè)置

1.3.8.2 離線模式(總是采用緩存內(nèi)容)

Gradle提供了一種離線模式,可以讓你構(gòu)建時總是采用緩存的內(nèi)容而無需去聯(lián)網(wǎng)檢查嵌溢,如果你并未采用動態(tài)版本特性且可以確保項目中依賴的版本都已經(jīng)緩存到了本地眯牧,這無疑是提高構(gòu)建速度的一個好選擇。開啟離線模式只需要在執(zhí)行命令時候添加--offline參數(shù)即可赖草。當(dāng)然学少,采用這種模式的也是有代價的,如果緩存中搜尋不到所需依賴會導(dǎo)致構(gòu)建失敗秧骑。

gradle build --offline

1.3.9 依賴-構(gòu)件的上傳與發(fā)布

借助maven-publish插件可以輕松地將jar包發(fā)布到倉庫中版确。這個過程沒啥幺蛾子直接上代碼吧

apply plugin: 'maven-publish'
apply plugin: 'java'

// 打包源文件
task sourceJar(type: Jar) {
    from sourceSets.main.allSource
    classifier = 'sources'
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

publishing {
     // 目標(biāo)倉庫
    repositories {
        maven {
           url "xxx"
        }
    }   

    publications {          
        mavenJava(MavenPublication) {
            // 設(shè)置gav屬性
            groupId 'org.pkaq'
            artifactId 'tiger'
            version '1.1'

            from components.java
            artifact sourceJar

             // 設(shè)置pom相關(guān)信息
            pom.withXml {
                Node root = asNode()              
                root.appendNode('description', 'bazinga!')
            }
        }
    }

}
//生成一個元的pom文件
model {
    tasks.generatePomFileForMavenJavaPublication {
        destination = file("$buildDir/generated-pom.xml")
    }
}

1.3.10 檢查依賴

在引用的依賴或傳遞性依賴存在版本沖突時,Gradle采用的策略是優(yōu)先選取最新的依賴版本解決版本沖突問題乎折。解決此類問題我們可以通過依賴管理方法進行排除绒疗、強制指定一個版本或者干脆禁用依賴傳遞特性解決。但如何知道哪些依賴傳遞了哪些子依賴骂澄,哪些傳遞的依賴又被Gradle進行了隱性升級呢吓蘑。采用下面的命令可以查看各個范圍的依賴樹。

gradle dependencies > dep.log

輸出結(jié)果:

dependencies

------------------------------------------------------------
Root project
------------------------------------------------------------

archives - Configuration for archive artifacts.
No dependencies

compile - Dependencies for source set 'main'.
+--- org.springframework.boot:spring-boot-starter-web:1.4.2.RELEASE
|    +--- org.springframework.boot:spring-boot-starter:1.4.2.RELEASE
|    |    +--- org.springframework.boot:spring-boot:1.4.2.RELEASE
|    |    |    +--- org.springframework:spring-core:4.3.4.RELEASE
|    |    |    |    \--- commons-logging:commons-logging:1.2
|    |    |    \--- org.springframework:spring-context:4.3.4.RELEASE
|    |    |         +--- org.springframework:spring-aop:4.3.4.RELEASE
|    |    |         |    +--- org.springframework:spring-beans:4.3.4.RELEASE
|    |    |         |    |    \--- org.springframework:spring-core:4.3.4.RELEASE (*)
|    |    |         |    \--- org.springframework:spring-core:4.3.4.RELEASE (*)
|    |    |         +--- org.springframework:spring-beans:4.3.4.RELEASE (*)
|    |    |         +--- org.springframework:spring-core:4.3.4.RELEASE (*)
|    |    |         \--- org.springframework:spring-expression:4.3.4.RELEASE
....
....
省略的
....
....
\--- org.apache.tomcat.embed:tomcat-embed-jasper:8.5.4
     +--- org.apache.tomcat.embed:tomcat-embed-core:8.5.4 -> 8.5.6
     +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.4 -> 8.5.6
     \--- org.eclipse.jdt.core.compiler:ecj:4.5.1

后面dep.log文件名可以隨意坟冲,然而磨镶,你一定在想為什么有些帶了(*)有的帶了->有的什么都沒有呢,這是什么鬼健提。前面已經(jīng)說過琳猫,當(dāng)發(fā)生版本沖突時Gradle會采用最新版本解決。仔細(xì)觀察帶了(*)的依賴你會發(fā)現(xiàn)這些依賴被不同的庫重復(fù)依賴了若干次私痹,這里(*)的意思即是表示該依賴被忽略掉了脐嫂。而->則表示其它的定級依賴的傳遞依賴中存在更高版本的依賴统刮,該版本將會使用->后面的版本來替代。

1.3.11 反向查找

如果你想知道某個依賴到底被哪個庫引用過账千,可以采用下面的命令進行反向查找

gradle dependencyInsight  --dependency tomcat-embed-core > reverse.log 

:dependencyInsight
org.apache.tomcat.embed:tomcat-embed-core:8.5.6 (conflict resolution)
+--- org.apache.tomcat.embed:tomcat-embed-websocket:8.5.6
|    \--- org.springframework.boot:spring-boot-starter-tomcat:1.4.2.RELEASE
|         \--- org.springframework.boot:spring-boot-starter-web:1.4.2.RELEASE
|              \--- compile
\--- org.springframework.boot:spring-boot-starter-tomcat:1.4.2.RELEASE (*)

org.apache.tomcat.embed:tomcat-embed-core:8.5.4 -> 8.5.6
\--- org.apache.tomcat.embed:tomcat-embed-jasper:8.5.4
     \--- compile

(*) - dependencies omitted (listed previously)

BUILD SUCCESSFUL

Total time: 6.936 secs

上面的報告中可以看到8.5.6這個版本后面標(biāo)注了(conflict resolution) 說明了該版本是用于解決沖突選用的版本侥蒙。

1.3.12 沖突即停

Gradle默認(rèn)采用自動升級版本的方式解決依賴沖突,有時這種隱式升級可能會帶來一些不必要的麻煩蕊爵,此時我們可以通過更改這種默認(rèn)行為來讓Gradle發(fā)現(xiàn)版本沖突時立即停止構(gòu)建并拋出錯誤信息辉哥。
更改腳本:

configurations.all {
  resolutionStrategy {
    failOnVersionConflict()
  }
}

執(zhí)行gradle build的輸出結(jié)果:

:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Could not resolve all dependencies for configuration ':compileClasspath'.
> A conflict was found between the following modules:
   - org.apache.tomcat.embed:tomcat-embed-core:8.5.4
   - org.apache.tomcat.embed:tomcat-embed-core:8.5.6

可以看到在執(zhí)行gradle build時由于tomcat-embed-core存在版本沖突導(dǎo)致了構(gòu)建失敗,并提示了沖突的兩個版本攒射。

1.3.13 依賴報告

Gradle官方提供了一個名叫project-report插件可以讓依賴查看更加簡單方便醋旦,要用此插件只需要在腳本中添加apply plugin: 'project-report'即可。該插件提供的任務(wù)可以參考下面的表格会放,所有輸出結(jié)果將被放在build/report下饲齐。

任務(wù)名稱 描述
dependencyReport 將項目依賴情況輸出到txt文件中 功能同gradle dependencies > build/dependenciestxt
htmlDependencyReport 生成HTML版本的依賴情況
propertyReport 生成項目屬性報告
taskReport 生成項目任務(wù)報告
projectReport 生成項目報告,包括前四個

1.3.14 使用插件檢查更新

使用三方插件進行檢查,可以使依賴固定在一個相對新的版本咧最,這里需要注意的是捂人,plugins需要放置在腳本的頂部

plugins {
   id "name.remal.check-dependency-updates" version "1.0.6" 
}

應(yīng)用此插件后,可以執(zhí)行gradle checkDependencyUpdatesgradle cDU檢查依賴最新版本

Task :web:checkDependencyUpdates
New dependency version: com.alibaba:druid: 1.0.29 -> 1.1.7

1.4 使用版本

1.4.1 強制使用版本

當(dāng)然,有時候可能僅僅是需要強制使用某個統(tǒng)一的依賴版本矢沿,而不是排除他們滥搭,那么此時force就該登場了。指定force = true屬性可以沖突時優(yōu)先使用該版本進行解決捣鲸。

compile('com.github.nanchen2251:CompressHelper:1.0.5'){
        force = true
 }

全局配置強制使用某個版本的依賴來解決依賴沖突中出現(xiàn)的依賴

configurations.all {
   resolutionStrategy {
       force 'com.github.nanchen2251:CompressHelper:1.0.5'
   }
}

另一個例子

//解決沖突 同一版本
configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (requested.name.startsWith("support-")||
                    requested.name.startsWith("animated")||
                    requested.name.startsWith("cardview")||
                    requested.name.startsWith("design")||
                    requested.name.startsWith("gridlayout")||
                    requested.name.startsWith("recyclerview")||
                    requested.name.startsWith("transition")||
                    requested.name.startsWith("appcompat")) {
                details.useVersion '25.0.0'
            }
        }
    }
}

1.4.2 使用動態(tài)版本

如果你想讓你的工程始終采用最新依賴瑟匆,那么Gradle提供了一種方式可以始終保證采用依賴的最新版本而無需每次手工檢查修改版本。

使用加號+,可以讓Gradle在每次執(zhí)行構(gòu)建時檢查遠(yuǎn)程倉庫是否存在該依賴的新版本栽惶,如果存在新版本則下載選用最新版本愁溜。當(dāng)然也可以指定依賴某個大版本下的最新子版本,1.+表示始終采用該依賴最新的1.x版本的最新依賴外厂。

  compile 'com.android.support:support-v4:+'//下載最新
  compile 'com.android.support:support-v4:23+'//基于23這個版本最新

雖然這是看上去十分風(fēng)騷的一種用法冕象,但這無疑會降低你系統(tǒng)構(gòu)建的速度同時提高構(gòu)建失敗的風(fēng)險。因為Gradle不得不每次檢查遠(yuǎn)程倉庫是否存在最新版本汁蝶,同時新版本也可能帶來無法預(yù)知的兼容性問題渐扮。

一個綜合案例

compile('com.github.nanchen2251:CompressHelper:1.0.5') {
   // 沖突時優(yōu)先使用該版本
   force = true
   // 依據(jù)構(gòu)建名稱排除
   exclude module: 'CompressHelper' 
   // 依據(jù)組織名稱排除
   exclude group: 'com.github.nanchen2251' 
   // 依據(jù)組織名稱+構(gòu)件名稱排除
   exclude group: 'com.github.nanchen2251', module: 'CompressHelper' 

   // 為本依賴關(guān)閉依賴傳遞特性
   transitive = false
}

轉(zhuǎn)載于:http://www.reibang.com/p/7ccdca8199b8

1.5 依賴管理

Gradle 中,dependencyManagement 塊有兩個主要部分:dependenciesimports穿仪。

dependencyManagement {
    imports {
        mavenBom "com.example:example-bom:${version}"
    }
    dependencies {
        //方便起見席爽,這里只列出了一個依賴
        dependency group: 'org.springframework', name: 'spring-web', version: '5.2.12.RELEASE'
    }
}

這兩者在功能和使用上有明顯的區(qū)別:

  • dependencies
    dependencies 部分用于在 dependencyManagement 塊中聲明依賴關(guān)系。這樣做的主要目的是為了集中管理項目中使用的依賴版本啊片。
    dependencies 部分聲明的依賴關(guān)系不會自動添加到項目中,它們僅僅用于指定版本號玖像。
    這個部分的作用并不是讓 Gradle 自動解析依賴關(guān)系紫谷,而是用于鎖定依賴版本齐饮,以確保項目中使用的依賴版本與聲明的版本一致。
  • imports
    imports 部分用于引入 Maven BOM(Bill of Materials)笤昨,并在項目中使用 BOM 中定義的依賴版本祖驱。通過引入 BOM,你可以確保項目中的依賴版本與 BOM 中定義的版本一致瞒窒。
    使用 imports 部分能夠更加方便地管理依賴版本捺僻,而不需要在每個依賴聲明中顯式地指定版本號。

2 下載安裝

2.1 下載解壓

官網(wǎng)下載地址: https://gradle.org/releases/
下載解壓的文件夾如下所示:

image.png

2.2 配置環(huán)境變量

配置環(huán)境變量崇裁,新建 GRADLE_HOME 環(huán)境變量指向 Gradle 解壓路徑的文件夾

image.png

%GRADLE_HOME%\bin 添加到 Path 環(huán)境變量中

image.png

2.3 配置Gradle倉庫

gradlemaven類似匕坯,也需要配置倉庫地址,首先新建一個文件夾拔稳,并在環(huán)境變量中配置默認(rèn)的倉庫地址GRADLE_USER_HOME

image.png

2.4 配置阿里云鏡像

gradle中的init.d文件夾中新建一個init.gradle文件葛峻,并在文件中添加如下配置

image.png

allprojects {
    repositories { 
        maven { url 'https://maven.aliyun.com/repository/public/' }       
        mavenLocal()        
        mavenCentral() 
    }
}

2.5 驗證

驗證gradle是否安裝成功,打開cmd命令行輸入 gradle -v

image.png

2.6 IDEA中配置Gradle

IDEASetting里打開"Build, Execution, Deployment"-"Build Tools"-"Gradle"
勾選 Use local Gradle distribution巴比,在 Gradle home 中選擇安裝的Gradle的路徑术奖。
如果在變量和配置文件中設(shè)置了Gradle的倉庫路徑,在 Service directory path 中就會自動填寫地址,如果想改的話可以手動修改
如圖所示:

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末之剧,一起剝皮案震驚了整個濱河市螃概,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唧龄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稼病,死亡現(xiàn)場離奇詭異选侨,居然都是意外死亡,警方通過查閱死者的電腦和手機然走,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門援制,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芍瑞,你說我怎么就攤上這事晨仑。” “怎么了拆檬?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵洪己,是天一觀的道長。 經(jīng)常有香客問我竟贯,道長答捕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任屑那,我火速辦了婚禮拱镐,結(jié)果婚禮上艘款,老公的妹妹穿的比我還像新娘。我一直安慰自己沃琅,他們只是感情好哗咆,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著益眉,像睡著了一般晌柬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郭脂,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天年碘,我揣著相機與錄音,去河邊找鬼朱庆。 笑死盛泡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娱颊。 我是一名探鬼主播傲诵,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼箱硕!你這毒婦竟也來了拴竹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剧罩,失蹤者是張志新(化名)和其女友劉穎栓拜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惠昔,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡幕与,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镇防。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啦鸣。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖来氧,靈堂內(nèi)的尸體忽然破棺而出诫给,到底是詐尸還是另有隱情,我是刑警寧澤啦扬,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布中狂,位于F島的核電站,受9級特大地震影響扑毡,放射性物質(zhì)發(fā)生泄漏胃榕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一瞄摊、第九天 我趴在偏房一處隱蔽的房頂上張望勤晚。 院中可真熱鬧枉层,春花似錦泉褐、人聲如沸赐写。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挺邀。三九已至,卻和暖如春跳座,著一層夾襖步出監(jiān)牢的瞬間端铛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工疲眷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禾蚕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓狂丝,卻偏偏與公主長得像换淆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子几颜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容