
1. 概述
Pippin, was a Hobbit of the Shire, and one of Frodo Baggins' youngest, but closest friends. He was a member of the Fellowship of the Ring and later became the thirty-second Thain of the Shire。
Gradle 是一個(gè)基于Apache Ant和 Apache Maven概念的項(xiàng)目自動(dòng)化構(gòu)建工具,它使用Groovy語言來聲明項(xiàng)目設(shè)置,拋棄了XML的各類繁瑣配置。面向Java應(yīng)用為主,當(dāng)前支持的語言有Java、Groovy、Kotlin、Scala、C++、Swift、JavaScript,計(jì)劃未來支持更多的語言。
本工程主要是針對 Gradle的學(xué)習(xí)入門類項(xiàng)目,也是借助于托爾金指環(huán)王的人物命名的工程,在學(xué)習(xí)本工程之前,對學(xué)習(xí)者有如下要求:
- 面向
Java語言的項(xiàng)目開發(fā)者,至少一年半以上開發(fā)類的經(jīng)驗(yàn) - 掌握
Maven在項(xiàng)目開發(fā)中的基本運(yùn)用,具體如下:- 熟練掌握
Nexus私服,創(chuàng)建和維護(hù)私服 - 掌握
Maven中環(huán)境構(gòu)建、依賴管理、編譯、打包、部署,并且可以基本運(yùn)用 - 了解
Maven中對插件的運(yùn)用,如maven-compiler-plugin、maven-resources-plugin等 - 了解
Maven中各類倉庫的概念,中央倉庫、本地倉庫
- 熟練掌握
- 了解項(xiàng)目中常用的版本命名規(guī)則
如果不滿足上述要求,建議先去補(bǔ)充 Maven有關(guān)的知識,因?yàn)?Gradle和 Maven還是有很多類似的地方。
通過本工程的學(xué)習(xí),會(huì)掌握 Gradle常見用法以及利用 Groovy編寫任務(wù)來完成自身項(xiàng)目開發(fā)需要,當(dāng)然本工程集成SpringBoot。也可以用來當(dāng)作 Gradle項(xiàng)目改造的模板來使用。
2. 友情關(guān)聯(lián)
Gitee鏈接:https://gitee.com/rothschil/pippin
Github鏈接:https://github.com/rothschil/pippin.git
3. 目錄結(jié)構(gòu)
|---.gradle
|---gradle ------------------Gradle配置文件
│ └─wrapper
│ gradle-wrapper.jar --gradle-wrapper 主題功能
│ gradle-wrapper.properties --Gradle當(dāng)前配置的版本,以及從哪里獲取
|---groovy-demo ------------------Groovy基本語法
| \---src
| +---gvy01 ------------------
| +---gvy03 ------------------
|---pippin-common ------------------通用模塊部分
| \---common-utils ------------------常用工具包,集成通用基類,供其他模塊引入
│ │ build.gradle ------------------工具包的構(gòu)建文件
│ │ dependencies.gradle ----------配置
|---pippin-service ------------------樣例服務(wù),這里用的一個(gè)JWT做個(gè)演示
| └─src
| ├─main
| │ └─resources
| │ ├─application.yml
| │ ├─config.properties
| │ ├─config
| │ │ ├─dev
| │ │ │ ├─application.prperties ----開發(fā)環(huán)境配置
| │ │ │
| │ │ └─prod
| │ │ ├─application.prperties ----生產(chǎn)環(huán)境配置
| │ build.gradle ------------------構(gòu)建文件
| │ dependencies-dev.gradle ----------開發(fā)環(huán)境配置
| │ dependencies-prod.gradle ----------生產(chǎn)環(huán)境配置
| │ dependencies-test.gradle ----------測試環(huán)境配置
│ .gitignore ------------------配置git忽略索要文件
│ build.gradle ------------------根目錄的構(gòu)建核心文件
│ gradle.properties ------------------根目錄的屬性文件,這是固定命名
│ gradlew
│ gradlew.bat ------------------Gradle Wrapper
│ LICENSE ------------------開源授權(quán)協(xié)議
│ README.md ------------------項(xiàng)目描述
│ settings.gradle ------------------Gradle模塊 配置文件
4. Maven與Gradle比較
- 靈活性:二者都提供約定優(yōu)于配置。但
Maven顯得非常僵化,沒法定制,一切都是 Maven給定的,不適用于許多自動(dòng)化問題。另一方面,Gradle是在考慮到授權(quán)和負(fù)責(zé)任的用戶的情況下構(gòu)建的。 - 性能:
Gradle特有的增量機(jī)制,所以相對來說縮短構(gòu)建所需的時(shí)間 - 用戶體驗(yàn):
Gradle提供了一個(gè)基于 Web 的交互式 UI 用于調(diào)試和優(yōu)化構(gòu)建:構(gòu)建掃描。這些也可以在本地托管,以允許組織收集構(gòu)建歷史并進(jìn)行趨勢分析、比較構(gòu)建以進(jìn)行調(diào)試或優(yōu)化構(gòu)建時(shí)間。 - 依賴管理:
Gradle允許生產(chǎn)者聲明api和implementation依賴項(xiàng),以防止不需要的庫泄漏到使用者的類路徑中。Maven允許發(fā)布者通過可選的依賴項(xiàng)提供元數(shù)據(jù)。
具體在性能上,Gradle 具備三個(gè)明顯特征:
- 增量性:
Gradle通過跟蹤任務(wù)的輸入和輸出并只運(yùn)行必要的內(nèi)容來避免工作,并且只在可能的情況下處理更改的文件。 - 構(gòu)建緩存:使用相同的輸入重用任何其他
Gradle構(gòu)建的構(gòu)建輸出,包括在機(jī)器之間。 -
Gradle守護(hù)進(jìn)程:一個(gè)長期存在的進(jìn)程,它使構(gòu)建信息在內(nèi)存中保持“熱”狀態(tài)

綜述,Maven 更加標(biāo)準(zhǔn),Gradle 更加簡潔靈活。
5. 環(huán)境構(gòu)建
5.1. JDK、Maven、Nexus版本要求
本工程運(yùn)行環(huán)境對應(yīng)的版本 JDK版本在 1.8、Maven版本 3.6、Nexus 3.34+ 三者的安裝不在本工程內(nèi)容中,自行百度腦補(bǔ)。
5.2. Gradle環(huán)境配置

- Windows下配置Gradle環(huán)境配置,需要先從 官網(wǎng) 下載
- 將下載的壓縮文件解壓到一個(gè)路徑下,例如:
D:\ProgramFiles\Gradle\gradle-7.2 - 配置環(huán)境變量
GRADLE_HOME,值為D:\ProgramFiles\Gradle\gradle-7.2 - 將
GRADLE_HOME添加到 path - 再添加環(huán)境變量
GRADLE_USER_HOME,這個(gè)是用戶空間,指向磁盤中一個(gè)文件夾即可,例如:E:\Repertory\RepositoryGradle\.gradle這個(gè)很重要 -
GRADLE_USER_HOME目錄下我們新建兩個(gè)文件,gradle.properties、init.gradle
5.2.1. gradle.properties
Gradle 配置項(xiàng),主要為了開啟多線程模式,Gradle 運(yùn)行時(shí)候效率更快一點(diǎn)
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.caching=true
5.2.2. init.gradle
Gradle 全局配置,主要定義定義倉庫
allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all {
ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
}
}
maven {
allowInsecureProtocol = true
url ALIYUN_REPOSITORY_URL
url ALIYUN_JCENTER_URL
}
}
}

5.3. IDEA工具集成
我使用的IDEA版本是 2021.1.2。

5.3.1. IDEA配置Gradle
IDEA 集成 Gradle需要安裝插件,否則無法使用,插件不論你在線安裝還是離線安裝都可以。


IDEA中的 Gradle user home 后的選項(xiàng)內(nèi)容將是配置的 GRADLE_USER_HOME 環(huán)境變量。 這個(gè)點(diǎn)非常會(huì)讓人忽視的。
5.1.3.2. 創(chuàng)建和認(rèn)識Java工程項(xiàng)目


- Name:項(xiàng)目名稱
- Location:所在的路徑
- GroupId、ArtifactId、Version
這些都與Maven雷同。

運(yùn)行 gradle build 的輸出結(jié)果
17:21:31: Executing task 'build'...
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar UP-TO-DATE
> Task :assemble UP-TO-DATE
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test NO-SOURCE
> Task :check UP-TO-DATE
> Task :build UP-TO-DATE
BUILD SUCCESSFUL in 131ms
1 actionable task: 1 up-to-date
17:21:31: Task execution finished 'build'.

上圖中羅列的基本任務(wù),可以先認(rèn)識下,下來重點(diǎn)描述下這兩個(gè)文件 build.gradle、setting.gradle,這是我們Gradle工程開發(fā)最核心的兩個(gè)文件。
- build.gradle
這個(gè)文件非常重要, Gradle 的核心配置文件,相當(dāng)于 Maven 中的 POM ,此后工程開發(fā)都圍繞著這個(gè)文件來編寫。
plugins { //插件
id 'java'
}
group 'xyz.wongs.gradle' // group 分組
version '1.0.0-SNAPSHOT' // 版本
repositories { // 倉庫
mavenCentral()
}
dependencies { // 依賴
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
test { // 測試
useJUnitPlatform()
}
- setting.gradle
這是針對模塊的引入配置文件,可以在此管理每個(gè)模塊激活狀態(tài),一般在添加新模塊的過程中使用。
rootProject.name = 'demo'
5.4. Gradle Wrapper
在 Maven中,開發(fā)者和項(xiàng)目服務(wù)器都需要配置有相同的 Maven版本,才能保證應(yīng)用正常編譯執(zhí)行,Gradle提供一個(gè) Gradle Wrapper概念,可以項(xiàng)目中自帶Gradle的處理環(huán)境,Gradle Wrapper簡化 Gradle本身的安裝、部署,避免 Gradle版本不通帶來的各種問題。
在任意目錄中 執(zhí)行 gradle wrapper

切換版本
| 操作 | 描述 |
|---|---|
| 切換 6.8 版本 | gradle wrapper --gradle-version 6.8 |
| 切換 6.5 版本 | gradle wrapper --gradle-version 6.5 |

執(zhí)行上述命令, gradle-wrapper.properties 中 distributionUrl 后的 URL 變?yōu)?https\://services.gradle.org/distributions/gradle-6.8-bin.zip ,版本切換成功。

5.5. 代碼分析器
所有開發(fā)人員編寫的代碼,在程序上線之前都一定要進(jìn)行性能的檢測,而對于 Gradle 項(xiàng)目來講,也需要清楚的知道,項(xiàng)目代碼構(gòu)建的情況,包括構(gòu)建環(huán)境、依賴庫以及程序性能上存在的問題,這樣方便與人溝通。為了解決這樣的構(gòu)建問題,所以在 Gradle 中就提供了一個(gè) Build Scan 代碼掃描工具, 這個(gè)工具會(huì)自動(dòng)的將本地構(gòu)建的過程發(fā)送到指定服務(wù)器端,并且由服務(wù)器端上生成一個(gè)完整的報(bào)告。
這個(gè)分析器是 gradle wrapper 提供的
gradlew build --scan

輸入郵箱,在郵箱中確認(rèn)



6. Groovy
Apache 的Groovy是Java平臺(tái)上設(shè)計(jì)的面向?qū)ο缶幊陶Z言。運(yùn)行于Java虛擬機(jī)上的Java字節(jié)碼,并與其他Java代碼和庫進(jìn)行互操作。由于其運(yùn)行在JVM上的特性,Groovy可以使用其他Java語言編寫的庫。Groovy的語法與Java非常相似,大多數(shù)Java代碼也符合Groovy的語法規(guī)則。

6.1. 環(huán)境構(gòu)建
官網(wǎng)下載 Groovy,當(dāng)前最新版本 3.0.7, Groovy是一個(gè)壓縮的工具包,對公工具包解壓,并講 Groovy下的bin路徑,配置到本地操作系統(tǒng)環(huán)境 path 屬性。


6.1.1. groovysh
Groovy 提供一個(gè)交互式編程,groovysh

6.1.2. IDEA創(chuàng)建Groovy
這里在 Gradle項(xiàng)目中新建 Groovy 項(xiàng)目 模塊, Groovy libray 選擇 Groovy 的文件路徑


- 創(chuàng)建包名為
xyz.wongs.groovy - 編寫腳本,這里要選擇
Groovy Script

編寫我們第一個(gè) Groovy代碼,Groovy 與Python非常類似。
package xyz.wongs.groovy
// python 3的語法結(jié)構(gòu)
println('Hello Groovy')

6.2. 語法結(jié)構(gòu)
6.2.1. 數(shù)據(jù)類型

6.2.2. 數(shù)組
Groovy 數(shù)組由 Java中 java.util.Arrays 工具提供的,所有Java中對數(shù)組的操作,在Groov y中同樣適用

6.2.3. 列表
列表是用于存儲(chǔ)數(shù)據(jù)項(xiàng)集合的結(jié)構(gòu)。在 Groovy 中,List 保存了一系列對象引用。List 中的對象引用占據(jù)序列中的位置,并通過整數(shù)索引來區(qū)分。列表文字表示為一系列用逗號分隔并用方括號括起來的對象。groovy 列表使用索引操作符 [] 索引。列表索引從 0 開始,指第一個(gè)元素。groovy 中的一個(gè)列表中的數(shù)據(jù)可以是任意類型。這java 下集合列表有些不同,java 下的列表是同種類型的數(shù)據(jù)集合。

package gvy02
// 列表
def list = [1,'2',23]
println('【列表輸出】'+list)
println('【列表轉(zhuǎn)字符】'+list.toString())
println('【列表長度】'+list.last())
6.2.4. 散列
也稱為關(guān)聯(lián)數(shù)組、映射、表,是對象引用的無序集合,類似Java中 Map,格式如: ['Key1':'Sam','Key2':'Abram']

package gvy02
// 字典 Map
def map = ['key1':'Grovy','key2':'Java']
println('【Map輸出】'+map)
println('【Map轉(zhuǎn)字符】'+map.toString())
println('【Map元素個(gè)數(shù)為】'+map.size())
for (String s:map.keySet()){
println('【遍歷】'+'Key='+s+' Value = '+map.get(s))
}
6.2.5. 多線程
Java開發(fā)過程中通過J.U.C工具定義多線程,Groovy參考Python腳本并且對Java的java.lang.Thread進(jìn)行擴(kuò)展,簡化了多線程的定義。 Groovy線程利用閉包進(jìn)行定義的居多,閉包的方式主要有 Thread.start 和 Thread.startDaemon。當(dāng)然Groovy中也有定時(shí)任務(wù),分別是Timer 和 TimerTask,兩種方式。
綜述, Groovy的多線程開發(fā), 僅僅是進(jìn)行Thread結(jié)構(gòu)的變化,其他結(jié)構(gòu)均按照Java程序的方式定義。
6.2.5.1. 定義
package gvy05
/**
* 1、多線程的定義
*/
println('【主線程】' + Thread.currentThread().getName())
// 1.1 start 模式
Thread.start {
println('【子線程-start】' + Thread.currentThread().getName())
'Groovy Project :https://gitee.com/rothschil/pippin'.each {
print(it)
}
println('\n')
}
println('https://www.github.com/rothschil/pippin')
// 1.2 startDaemon 模式
Thread.startDaemon {
println('【子線程-startDaemon】' + Thread.currentThread().getName())
'Groovy Project :https://gitee.com/rothschil/'.each {
print(it)
}
println('\n')
}
6.2.5.2. 線程同步
def ticket =10
def sale ={->
synchronized (this){
sleep(100)
println('[Buy tickets]'+Thread.currentThread().getName()+ ' The remaining votes ' +(ticket--))
}
}
for(x in 1..10){
def st = Thread.start(sale)
st.name='TicketSeller -'+x
}
6.2.5.3. 定時(shí)任務(wù)
package gvy05
// 定時(shí)任務(wù)
new Timer('[Timer]').runAfter(1000) {
for (int i = 0; i < 10; i++) {
println('【定時(shí)任務(wù)】' + Thread.currentThread().getName() + ' Groovy Project :https://gitee.com/rothschil/pippin')
}
}
6.2.5.4. J.U.C操作
package gvy05
import java.util.concurrent.CountDownLatch
// JUC 定義兩個(gè)線程,讓線程1 必須要等待線程2 執(zhí)行完畢后 才能執(zhí)行
CountDownLatch countDownLatch = new CountDownLatch(1)
def firstThread = Thread.start {
countDownLatch.await()
println('[The First Thread] ' + Thread.currentThread().getName())
}
def secondThread = Thread.start {
sleep(1000)
println('[The Second Thread] ' + Thread.currentThread().getName())
countDownLatch.countDown()
}
// 第一個(gè)線程先啟動(dòng)
firstThread
secondThread
6.2.5.5. 線程池
package gvy05
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())
for (x in 1..20) {
es.submit(() -> {
println('[ThreadPool]' + Thread.currentThread().getName())
})
}
6.2.6. 更改類型
使用 def關(guān)鍵字定義的所有變量類型都是可以動(dòng)態(tài)更改,這和Python類似,使用起來比較靈活。
package gvy01
def msg = 'Groovy'
println("【1】 msg 對應(yīng)的類型是 "+ msg.class)
msg = 3
println("【2】 msg 對應(yīng)的類型是 "+ msg.class)
msg = 1.3
println("【3】 msg 對應(yīng)的類型是 "+ msg.class)

6.2.7. 數(shù)據(jù)溢出
package gvy01
def ix1 = Integer.MAX_VALUE+1
println("【1】 ix1 對應(yīng)的類型是 "+ ix1.class +" 變量內(nèi)容:"+ix1)
def ix2 = 21474836499
println("【2】 ix2 對應(yīng)的類型是 "+ ix2.class +" 變量內(nèi)容:"+ix2)
def ix3 = 2342546543634532424324233
println("【3】 ix3 對應(yīng)的類型是 "+ ix3.class +" 變量內(nèi)容:"+ix3)

6.2.8. 異常
和Java一樣的異常處理方式
- 檢測異常:在編譯時(shí)檢查異常
- 未經(jīng)檢查的異常:未檢查的異常在編譯期不檢查,而是在運(yùn)行時(shí)檢查,如ArrayIndexOutOfBoundsException
- 錯(cuò)誤:程序永遠(yuǎn)不能恢復(fù)的錯(cuò)誤,將導(dǎo)致程序崩潰,如OutOfMemoryError,VirtualMachineError,AssertionError

7. Gradle詳解
通過上面對Groovy語法的介紹,這一章節(jié),通過以Groovy 來編寫Gradle任務(wù)。
7.1. 任務(wù)創(chuàng)建
Gradle 中任務(wù)創(chuàng)建有四種方式,日常使用中比較多的是采用閉包的方式。
// 1、原型創(chuàng)建
def task1 = task(task1)
task1.doLast {
println '【1、原型創(chuàng)建】最后執(zhí)行'
}
// 2、任務(wù)屬性創(chuàng)建
def task2 = task([description: ' Is My Task2', group: 'xyz.wongs'],task2)
task2.doLast {
println '【2、任務(wù)屬性創(chuàng)建】最后執(zhí)行'
}
// 3、閉包機(jī)制
task task3 {
description(' Is My Task3')
group('xyz.wongs')
doLast {
println '【3、閉包機(jī)制】最后執(zhí)行'
}
}
// 4、任務(wù)容器 TaskContainer
tasks.create('task4') {
description(' Is My Task4')
group('xyz.wongs')
doLast {
println '【4、任務(wù)容器 TaskContainer】最后執(zhí)行'
}
}
7.2. 屬性
屬性是Task在定義中說明的,在Task類中,我們可以看到提供這些屬性,都可以通過外部訪問。


task taskPro {
description('Properties Demo')
group('xyz.wongs.gradle')
doLast {
println '【1、Propertie】屬性設(shè)置'
}
}
7.3. 繼承
整個(gè)Gradle中的任務(wù)都可以被繼承,只需要定義一個(gè)父類的任務(wù),在其中編寫自己的業(yè)務(wù),同時(shí)再繼承 DefaultTask 即可。
// 二、繼承
// 定義Java程序類
class CustomerTask extends DefaultTask {
// TaskAction 任務(wù)執(zhí)行注解
@TaskAction
def doSelf() {
// 實(shí)現(xiàn)的主體
println '【3、Extends-doSelf】 Operation Body'
}
@TaskAction
def doLast() {
println '【3、Extends-doLast】 doLast Operation'
}
}
task taskExtends(type: CustomerTask) {
description('Extends Demo')
doFirst {
println '【3、Extends】繼承'
}
doLast {
println '【3、Extends】繼承'
}
}

7.4. 任務(wù)依賴
任務(wù)之間的依賴關(guān)系,為了方便控制任務(wù)執(zhí)行過程中的優(yōu)先級,如同我們Maven中,在運(yùn)行jar任務(wù)之前,complie任務(wù)一定要執(zhí)行過,也就是jar依賴于compile,在Gradle中,通過DependsOn控制依賴關(guān)系,DependsOn 是Task類的一個(gè)方法,可以接受多個(gè)依賴的任務(wù)作為參數(shù)

// 任務(wù)依賴
task taskDependsOnC() {
group("xyz.wongs.gradle")
doFirst {
println '【5、DependsOnC】 doFirst'
}
}
task taskDependsOnD() {
// 任務(wù)禁用
enabled = true
group("xyz.wongs.gradle")
doFirst {
println '【5、DependsOnD】 doFirst'
}
}
task taskDependsOnB(dependsOn: [taskDependsOnD, taskDependsOnC]) {
group("xyz.wongs.gradle")
doFirst {
println '【5、DependsOnB】 doFirst'
}
}
task taskDependsOnA(dependsOn: [taskDependsOnB]) {
group("xyz.wongs.gradle")
doFirst {
println '【5、DependsOnA】 doFirst'
}
}
7.5. 文件處理
編寫多任務(wù)處理過程中需要用到對各類資源文件的控制,涉及到Gradle對文件操作,常用的對文件操作主要有:
- 本地文件:指定文件的相對路徑或絕對路徑來對文件的操作
- 文件集合:對一組文件的列表進(jìn)行操作,但文件集合中的文件對象是延遲,任務(wù)調(diào)用才會(huì)創(chuàng)建
- 文件樹:有層級結(jié)構(gòu)的文件集合,一個(gè)文件樹它可以代表一個(gè)目錄結(jié)構(gòu)或一 ZIP 壓縮包中的內(nèi)容結(jié)構(gòu)。文件樹是從文件集合繼承過來的,所以文件樹具有文件集合所有的功能。
- 文件拷貝:可以使用Copy任務(wù)來拷貝文件,通過它可以過慮指定拷貝內(nèi)容,還能對文件進(jìn)行重命名操作等。Copy任務(wù)必須指定一組需要拷貝的文件和拷貝到的目錄
- 歸檔文件:通常一個(gè)項(xiàng)目會(huì)有很多的 Jar 包,將項(xiàng)目打包成一個(gè) WAR、ZIP、TAR 包進(jìn)行發(fā)布,可以使用Zip,Tar,Jar,War和Ear任務(wù)來實(shí)現(xiàn)
7.5.1. 本地文件
// 1、本地文件
def Task taskLocalFile = task(taskLocalFile) {
doFirst {
// 使用相對路徑
File configFile = file('src/main/resources/config.xml')
configFile.createNewFile();
def _path = 'D:/Code/98_Github/Gradle/grad/src/main/resources/config.xml'
// 使用絕對路徑
configFile = file(_path)
println('【1、本地文件 使用絕對路徑】' + configFile.absolutePath)
// 使用一個(gè)文件對象
configFile = file(new File(_path))
println('【1、本地文件 使用文件對象】' + configFile.exists())
}
}
7.5.2. 文件集合
// 2、文件集合
def Task taskCollectionFile = task(taskCollectionFile) {
doFirst {
File _fileList = file('gvoovy-demo/src/gvy01')
def FileCollection collection = files(_fileList.listFiles()) // 獲取文件列表
collection.each { println(it) } // 遍歷文件列表
Set _set1 = collection.files // 文件集合轉(zhuǎn)為 Set
Set _set2 = collection as Set
List _list = collection as List // 文件集合轉(zhuǎn)為 List
String _path = collection.asPath // 文件集合轉(zhuǎn)為 String
}
}
7.5.3. 文件樹
// 3、文件樹
def Task taskFileTree = task(taskFileTree) {
doFirst {
FileTree _fileTree = fileTree('gvoovy-demo/src/gvy01') // 1、指定目錄創(chuàng)建文件樹對象
_fileTree.include '**/*.groovy' // 添加包含指定文件
_fileTree.exclude '**/del*' // 添加排除指定文件
// 2、使用路徑創(chuàng)建文件樹對象,同時(shí)指定包含的文件
_fileTree = fileTree('gvy/src').include('**/*.groovy')
_fileTree = fileTree('gvy/src') { // 3、通過閉包創(chuàng)建文件樹
include '**/*.groovy'
}
_fileTree = fileTree(dir: 'gvoovy-demo/src/gvy01', include: '**/*.groovy') // 通過map創(chuàng)建文件樹
_fileTree = fileTree(dir: 'gvoovy-demo/src/gvy01', includes: ['**/*.groovy', '**/*.xml'])
_fileTree = fileTree(dir: 'gvoovy-demo/src/gvy01', include: '**/*.groovy', exclude: '**/*del*/**')
_fileTree.each { File file -> // 遍歷文件樹的所有文件
println(file)
}
}
}
7.5.4. 文件拷貝
// 4、文件拷貝
task taskFileCopy(type: Copy) {
from 'src/main/resources/config.log'
// 從Zip壓縮文件中拷貝內(nèi)容
from zipTree('src/main/resources/00.zip')
into 'src/main/java/'
// 添加過慮條件來指定包含或排除的文件
include '**/*.png'
}
7.6. 依賴庫范圍

7.7. 日志處理
項(xiàng)目開發(fā)過程中,所有重要數(shù)據(jù)內(nèi)容都需要通過日志的形式輸出,Gradle內(nèi)部提供各種日志組件。

7.8. 項(xiàng)目打包
一個(gè)完整的項(xiàng)目打包過程中,會(huì)包含三個(gè) *.jar 文件:主程序 projectName-version.jar、源代碼 projectName-version-sources.jar、文檔 projectName-version-javadoc.jar,所以要想在 Gradle中生成上述文檔,需要在項(xiàng)目定義相關(guān)的任務(wù)處理來完成這三個(gè)文件的輸出。
apply plugin: 'java'
group 'xyz.wongs.gradle'
version '1.0-SNAPSHOT'
def jdkVersion = 1.8
sourceCompatibility = jdkVersion
targetCompatibility = jdkVersion
repositories { mavenCentral() }
dependencies { compile('org.apache.poi:poi:5.0.0') }
test { useJUnitPlatform() }
//程序主類名稱
def mainClass = 'xyz/wongs/gradle/GradleStart.java'
jar {
// Jar文件名稱
archiveBaseName = 'grad'
manifestContentCharset = 'UTF-8'
//文件編碼
metadataCharset('UTF-8')
//內(nèi)容編碼
manifest {
//程序主版本號
attributes 'Manifest-Version': getArchiveVersion().getOrNull(),
'Main-Class': "$mainClass",
'Implementation-Titile': 'grad-Tiltle',
'Implementation-Version': archiveVersion //版本編號
// 所有第三方包放置到 lib文件夾下
}
into('lib') {
//運(yùn)行時(shí)組件
from configurations.runtime
}
}
7.9. 常用命令

8. 進(jìn)階內(nèi)容
8.1. 多環(huán)境
目開發(fā)過程中,有開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境,每個(gè)環(huán)境的配置也相同,與Maven項(xiàng)目類似,Gradle配置多環(huán)境用在環(huán)境屬性文件和依賴配置 兩個(gè)地方,實(shí)現(xiàn)可分為以下步驟:
- 通過約定規(guī)則,編寫多環(huán)境信息
- 在
build.gradle文件中添加獲取
def env=System.getProperty('env')?:'dev'
- 最后在執(zhí)行過程中添加參數(shù):
-D{屬性名稱}={內(nèi)容}
8.2. 插件
| 名稱 | 描述 |
|---|---|
| Java插件 | 為Java提供編輯、測試和打包的能力 |
| java-library插件 | 構(gòu)建本地依賴的插件 |
| maven-publish插件 | 項(xiàng)目發(fā)布到倉庫的插件 |
| Springboot插件 | 提供Spring Boot支持,允許打包可執(zhí)行jar或war |
| War插件 | 繼承Java插件,為Web應(yīng)用提供War包的功能 |
| IDEA插件 | 生成IDEA的工程文件,使得工程快速導(dǎo)入IDEA工程中 |
| Jetty插件 | 繼承War插件,為應(yīng)用程序添加三個(gè)主要任務(wù),把應(yīng)用部署到Jetty Web容器 |
| Application插件 | 創(chuàng)建可執(zhí)行JVM應(yīng)用,直接打成包含啟動(dòng)腳本Tar和Zip包 |
| CheckStyle插件 | 為工程添加CheckStyle質(zhì)量檢測 |
| FindBugs插件 | 為工程添加FindBugs質(zhì)量檢測 |
| PMD插件 | 為工程添加PMD質(zhì)量檢測 |
| JaCoCo插件 | 分析單元測試覆蓋率的工具 |
| Sonar插件 | 分析檢查代碼質(zhì)量 |
8.3. 項(xiàng)目發(fā)布
項(xiàng)目發(fā)布我們使用插件 maven-publish,將構(gòu)建內(nèi)容發(fā)布到Apache Maven存儲(chǔ)庫的功能??梢员?Maven、Gradle 和其他了解 Maven 存儲(chǔ)庫格式的工具使用
apply plugin: 'maven-publish'
