1 Gradle
1.1 介紹
gradle
和maven
一樣都是用來構(gòu)建java
程序的夯巷,maven2004
年開始興起探赫,gradle2012
年開始誕生痢艺,既然已經(jīng)有了maven
這么成熟的構(gòu)建工具為什么還有gradle
的誕生呢店量,因為gradle
有很多地方比maven
做的更好翘紊,例如gradle
采用groovy
語言開發(fā)余佃,語法更加簡單暮刃,例如maven
一個配置需要三行,而gradle
只需要一行即可
Gradle
是繼Maven
之后的新一代構(gòu)建工具爆土,它采用基于groovy
的DSL
語言作為腳本椭懊,相比傳統(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)
- 標(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工程)
- 非標(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']
}
- 搭配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)中,舉個栗子谓晌,如oracle
的OJDBC
驅(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é)果了解。
可以看到钥勋,我們的項目依賴了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
可以接收group
和module
兩個參數(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 checkDependencyUpdates
或 gradle 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
塊有兩個主要部分:dependencies
和 imports
穿仪。
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/
下載解壓的文件夾如下所示:
2.2 配置環(huán)境變量
配置環(huán)境變量崇裁,新建 GRADLE_HOME
環(huán)境變量指向 Gradle
解壓路徑的文件夾
%GRADLE_HOME%\bin
添加到 Path
環(huán)境變量中
2.3 配置Gradle倉庫
gradle
和maven
類似匕坯,也需要配置倉庫地址,首先新建一個文件夾拔稳,并在環(huán)境變量中配置默認(rèn)的倉庫地址GRADLE_USER_HOME
2.4 配置阿里云鏡像
在gradle
中的init.d文件夾
中新建一個init.gradle文件
葛峻,并在文件中添加如下配置
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public/' }
mavenLocal()
mavenCentral()
}
}
2.5 驗證
驗證gradle
是否安裝成功,打開cmd命令行輸入 gradle -v
2.6 IDEA中配置Gradle
在IDEA
的Setting
里打開"Build, Execution, Deployment"-"Build Tools"-"Gradle"
勾選 Use local Gradle distribution
巴比,在 Gradle home
中選擇安裝的Gradle
的路徑术奖。
如果在變量和配置文件中設(shè)置了Gradle
的倉庫路徑,在 Service directory path
中就會自動填寫地址,如果想改的話可以手動修改
如圖所示: