90分鐘玩轉(zhuǎn)Gradle

gradle

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 AntApache Maven概念的項(xiàng)目自動(dòng)化構(gòu)建工具,它使用Groovy語言來聲明項(xiàng)目設(shè)置,拋棄了XML的各類繁瑣配置。面向Java應(yīng)用為主,當(dāng)前支持的語言有Java、Groovy、KotlinScala、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)?GradleMaven還是有很多類似的地方。

通過本工程的學(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)者聲明apiimplementation依賴項(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)
Gradle與Maven性能比較

綜述,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)境配置

官網(wǎng)
  • 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.propertiesinit.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

20210907170523

5.3.1. IDEA配置Gradle

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

20210907165919
20210907174102

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)目

New Project_1
New Project_2
  • Name:項(xiàng)目名稱
  • Location:所在的路徑
  • GroupId、ArtifactId、Version

這些都與Maven雷同。

New Project_3

運(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ù)

上圖中羅列的基本任務(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

20210908092359

切換版本

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

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

20210908093313

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
20210908093948

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

首頁
郵箱確認(rèn)
報(bào)告內(nèi)容

6. Groovy

ApacheGroovyJava平臺(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ī)則。

20210908095332

6.1. 環(huán)境構(gòu)建

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

20210908095718
20210908095612

6.1.1. groovysh

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

20210908095756

6.1.2. IDEA創(chuàng)建Groovy

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

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

編寫我們第一個(gè) Groovy代碼,GroovyPython非常類似。

package xyz.wongs.groovy

// python 3的語法結(jié)構(gòu)
println('Hello Groovy')
20210908101202

6.2. 語法結(jié)構(gòu)

6.2.1. 數(shù)據(jù)類型

20210908104458

6.2.2. 數(shù)組

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

20210909152949

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']

20210909153133
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腳本并且對Javajava.lang.Thread進(jìn)行擴(kuò)展,簡化了多線程的定義。 Groovy線程利用閉包進(jìn)行定義的居多,閉包的方式主要有 Thread.startThread.startDaemon。當(dāng)然Groovy中也有定時(shí)任務(wù),分別是TimerTimerTask,兩種方式。
綜述, 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)

20210909155259

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)
20210909155415

6.2.8. 異常

和Java一樣的異常處理方式

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

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類中,我們可以看到提供這些屬性,都可以通過外部訪問。

20210909160048
20210909155934
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】繼承'
    }
}
20210909161301

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ù)

20210909161417

// 任務(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. 依賴庫范圍

20210909161903

7.7. 日志處理

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

20210909162056

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. 常用命令

20210909162804

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'
20210909163335
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容