gradle簡(jiǎn)明教程
前言
本文沒(méi)有 gradle 與 maven 對(duì)比,也沒(méi)有深入 gradle 實(shí)現(xiàn)。只有 gradle 從 0 開(kāi)始使用的說(shuō)明。
- 簡(jiǎn)介
- 安裝
- 新建一個(gè) gradle 項(xiàng)目
- 引入一個(gè) gradle 項(xiàng)目
- 常見(jiàn)問(wèn)題
- 交流
簡(jiǎn)介
gradle 是一個(gè)構(gòu)建工具。負(fù)責(zé)管理項(xiàng)目依賴,組織項(xiàng)目結(jié)構(gòu),完成項(xiàng)目構(gòu)建的工作。
安裝
從 官網(wǎng) 下載,解壓即可,并將 bin/gradle 命令加入到 path 中。
新建一個(gè) gradle 項(xiàng)目
-
新建一個(gè)文件夾作為項(xiàng)目文件夾
mkdir project-example cd project-example -
使用 gradle 初始化
gradle init然后目錄下會(huì)生成這些文件
build.gradle // 構(gòu)建腳本文件,主要的構(gòu)建配置都在這里寫 gradle // 存放gradle wrapper 執(zhí)行配置和工具的文件夾, gradlew // gradle wrapper 執(zhí)行腳本文件,用來(lái)在沒(méi)有安裝 gradle 的情況下執(zhí)行 gradle 命令。當(dāng)然,第一次執(zhí)行時(shí)會(huì)下載 gradle。 gradlew.bat // gradle wrapper 執(zhí)行腳本文件的 windows 版 settings.gradle // 項(xiàng)目配置,指明根項(xiàng)目名字和引入的 module -
修改 build.gradle 文件,結(jié)果像下面這樣
/* 聲明插件,聲明插件的方式有兩種,下面這種是 2.* 版本之后的新的定義方式。可以聲明兩種插件: 1. 官方內(nèi)置插件,如 java,idea。 2. 在 gradle 插件中心注冊(cè)過(guò)的插件,如第三個(gè)就是,這種要還要聲明版本。 聲明插件的目的是因?yàn)椴寮?huì)提供很多 task,而每一個(gè) task 就是一段構(gòu)建腳本,可以執(zhí)行不同的任務(wù)。比如 compileJava,test 等。 */ plugins { id 'java' id 'idea' id "com.yangxiaochen.scaffold" version "1.0.2" } /* 聲明 group 和 版本,而 project 的名字在 settings.gradle 文件中,而子 module ,或者又稱為 sub projects 的名字通常和文件夾名字一樣。 */ group 'com.yangxiaochen.gradle' version '1.0.0-SNAPSHOT' /* 聲明依賴倉(cāng)庫(kù),這里使用的是 jcenter,也可以使用其他的如 mavenCentral 等。也可以聲明多個(gè),會(huì)按順序查找。 */ repositories { jcenter() } /* 聲明依賴 */ dependencies { compile 'org.slf4j:slf4j-api:1.7.21' testCompile 'junit:junit:4.12' }編輯 settings.gradle 文件如下,聲明了project name
rootProject.name = 'project-example' // include 'sub-project' -
引入到 Idea IDE 中
gradle idea目錄下新生成了三個(gè)文件
project-example.iml project-example.ipr project-example.iws接下來(lái)只要用 Idea IDE 來(lái) open project-example.ipr 文件,就可以引入 project 了, 之后每當(dāng)
依賴更改
目錄結(jié)構(gòu)更改
只要執(zhí)行
gradle cleanIdea idea就可以刷新這三個(gè)文件,Idea IDE 就會(huì)重新加載識(shí)別項(xiàng)目了。我的經(jīng)驗(yàn)是不要使用 Idea IDE 來(lái)直接用 build.gradle 來(lái)打開(kāi)文件,因?yàn)?Idea IDE 在解析 build.gradle 文件時(shí)有其他操作,而且 Idea IDE 與 gradle 版本有時(shí)會(huì)不太兼容,導(dǎo)致項(xiàng)目解析錯(cuò)誤;而使用 gradle 來(lái)生成 Idea IDE 工程文件的方式就不會(huì)有問(wèn)題,而且速度更快,更容易debug。
-
引入之后,還需要生成 src 文件夾和 sub project
gradle createSrc gradle idea // 或者直接連起來(lái)些,像這樣 gradle createSrc idea gradle createModule --name foo ideacreateSrc和createModule都是插件com.yangxiaochen.scaffold里的 task,而idea和cleanIdea是插件idea提供的 task
引入一個(gè) gradle 項(xiàng)目
跟上一節(jié)創(chuàng)建一個(gè) gradle 項(xiàng)目類似,引入idea插件,然后生成 Idea IDE 的工程文件,再 open 即可
常見(jiàn)問(wèn)題
插件選擇
內(nèi)置插件都在官方文檔中有說(shuō)明,除了內(nèi)置插件外, 可以 Search Gradle plugins,gradle 插件的官方倉(cāng)庫(kù)。
build速度慢
速度慢一般來(lái)說(shuō)是依賴更新慢,因?yàn)楸娝苤脑?,?guó)內(nèi)使用國(guó)外的倉(cāng)庫(kù)速度并不樂(lè)觀,所以可以替換repositories, 使用阿里云的倉(cāng)庫(kù)
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/groups/public"
}
}
再者, 有的同學(xué)使用私服, 可能是公司搭建的. 這個(gè)有時(shí)候會(huì)有不穩(wěn)定, 且有時(shí)需要認(rèn)證的情況. 看稍后的章節(jié).
如何debug
gradle 運(yùn)行中的提示并不算很友好, 尤其在鏈接倉(cāng)庫(kù)和下載jar包時(shí), 在連接有問(wèn)題的時(shí)候, 經(jīng)常沒(méi)有提示(新版本的可能好一些.)
經(jīng)常使用
gradle idea -i
gradle idea -id
還可以加入 --no-daemon 參數(shù)來(lái)避免daemon啟動(dòng)產(chǎn)生的日志干擾
gradle idea -id --no-daemon
一般來(lái)說(shuō)就能定位到構(gòu)建問(wèn)題.
來(lái)獲取更多的信息. 比較常見(jiàn)的卡住是因?yàn)?code>倉(cāng)庫(kù)鏈接不上, jar包下載鏈接不上, 又不返回 response (私有倉(cāng)庫(kù)偶爾有問(wèn)題), 資源下載緩慢, 倉(cāng)庫(kù)需要認(rèn)證登陸
- 倉(cāng)庫(kù)連接不上: 檢查倉(cāng)庫(kù)地址, 檢查網(wǎng)絡(luò).
- 資源無(wú)法連接又沒(méi)有response: 這種通常會(huì)在上面打出的日志中體現(xiàn), 請(qǐng)求一個(gè) url 便沒(méi)有響應(yīng).
- 下載緩慢: 更換倉(cāng)庫(kù), 或者忍耐下第一次, 以后會(huì)好很多
在 IDEA 刷新有問(wèn)題時(shí), 可以執(zhí)行這個(gè)命令debug, 一般這個(gè)命令能成功, 那么 IDEA 刷新通常也能成功. (請(qǐng)注意版本問(wèn)題, 命令行里執(zhí)行的 gradle 版本需要跟 IDEA 里配置的 gradle 版本一致)
私服使用和包管理混亂引起的問(wèn)題
私服使用中會(huì)有以下問(wèn)題:
不穩(wěn)定, 偶爾服務(wù)無(wú)響應(yīng).
-
配置出錯(cuò), 無(wú)法 proxy maven 主倉(cāng)庫(kù). 或者出現(xiàn)私服中存在第三方包但是卻不完整到時(shí)無(wú)法下載.
一般來(lái)說(shuō)會(huì)嘗試把第三方倉(cāng)庫(kù)配置到私服之前:
maven { url "http://maven.aliyun.com/nexus/content/groups/public" } maven { url "http://你家私服地址/" credentials { username "xxx" password "xxx" } authentication { basic(BasicAuthentication) } }這樣先去第三方查找, 再到私服查找.
-
私服有認(rèn)證. 可以參照第二條私服的認(rèn)證方式. 其中
authentication { basic(BasicAuthentication) }是可選填的, 不填的話會(huì)自動(dòng)識(shí)別認(rèn)證方式.
-
打包方式不完整. 有的同學(xué)上傳包的時(shí)候雖然包含了編譯后的jar包, pom文件, 但是有時(shí)卻沒(méi)有把source包上傳, gradle 默認(rèn)是會(huì)下載source的, 如果沒(méi)有, 私服返回404還好, 最怕會(huì)卡主(遇到過(guò)私服雖然沒(méi)有這個(gè)文件卻遲遲不返回response的情況.), 所以, 如果遇到這種問(wèn)題, 可以:
idea { module { downloadJavadoc = false downloadSources = false } }不讓 IDEA 刷新的時(shí)候下載源碼和文檔, 萬(wàn)不得已還是不要用.
常用命令或參數(shù)
--refresh-dependencies 刷新依賴,刷新那些SNAPSHOT的依賴,類似于 maven 的 -U 參數(shù)
gradle tasks 列出所有可執(zhí)行的task
gradle tasks --all 列出所有可執(zhí)行的task, 并附加上 mudole
gradle help --task taskName 查看一個(gè)task的幫助, 不過(guò)并不是所有task都有, 因?yàn)閠ask都是可以自己來(lái)實(shí)現(xiàn)的.
gradle idea -id 用來(lái)debug IDEA進(jìn)行刷新時(shí)遇到的問(wèn)題, 一般這個(gè)任務(wù)能成功, 刷新就能成功. 注意使用的 gradle 版本要一致.
--no-daemon 不是使用daemon進(jìn)行構(gòu)建. daemon的作用是不用每次 build 都再啟動(dòng)一個(gè)進(jìn)程, 節(jié)省時(shí)間. 但卻會(huì)在我們 debug 問(wèn)題的時(shí)候不停的生產(chǎn)日志, 產(chǎn)生干擾.
依賴沖突處理
可以通過(guò)命令來(lái)查看一個(gè)項(xiàng)目的依賴
gradle webapp:dependencies --configuration=compile
不同于maven的最近原則,gradle 依賴使用的是最新原則.
依賴排除, 通??梢允褂?/p>
compile("org.springframework.boot:spring-boot-starter-web") {
exclude module: "spring-boot-starter-logging"
}
這樣的語(yǔ)法, 還有更為粗暴直接的:
configurations {
all*.exclude group: 'ch.qos.logback', module: 'logback-classic'
all*.exclude group: 'ch.qos.logback', module: 'logback-core'
}
參考資料
官方文檔相當(dāng)?shù)脑敿?xì),且附有很多example,配合 gradle 安裝包里的 example 源文件閱讀
交流
歡迎加入群 661035226,gradle,spring,activiti 交流