1. 程式人生 > >Gradle構建工具從入門到精通(IDEA)

Gradle構建工具從入門到精通(IDEA)

1.Gradle安裝

官網下載壓縮包,然後解壓,配置本地環境變數。主要有下面兩個:

GRADLE_HOME 是解壓後的目錄,

GRADLE_USER_HOME 的作用是讓其他程式檢測到本地.gradle資料夾的位置,

再把 %GRADLE_HOME%\bin 追加到 Path 環境變數中。

然後在D:\.gradle目錄下新建init.gradle檔案,使用記事本開啟貼上下列程式碼:

allprojects{
    repositories {
        def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content
/groups/public/'
all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
remove repo } } } maven { url REPOSITORY_URL } } }

即可更換maven倉庫地址為國內阿里雲映象。

2.Groovy語法

開啟IDEA,點選Tools,找到Groovy Console,單擊。

輸入一些Groovy語法,單擊綠色按鍵執行程式。

上面的程式省略了傳參時的括號(),執行結果如下圖:

Groovy字串的特性

  1. 'a':只是字串
  2. "a":裡面可以連線變數$(b)
  3. '''a''':裡面的字串可以換行

list:

def buildTools=['ant','maven']
//新增list
buildTools << 'gradle'

map

def buildYears=['ant':2000,'maven':2004]
//新增map
buildYears.gardle=2009

閉包

閉包是一個程式碼塊,語法如下:

{ [closureParameters -> ] statements }

其中[]內是可選的閉包引數,可省略。當閉包帶有引數,就需要->來將引數和閉包體相分離。示例:

def c1={ v -> println v }

3.Gradle指令碼

新建gradle Java專案的預設指令碼檔案內容:

plugins {
    id 'java'
}

group 'cn.zyzpp'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

解讀指令碼:

  1. 方法呼叫基本都省略了(),比如 group('cn.zyzpp')
  2. 還有給引數設值 X=x
  3. 使用閉包{}來作為引數執行repositories()、dependencies()方法,這倆方法的呼叫同樣忽略了()的書寫

4.IDEA使用Gradle

4.1 新建Gradle程式。

外掛命令說明:

  1. jar用於將檔案編譯為jar包;
  2. build會執行build.gradle檔案,由於外掛是Java,所以也會將檔案編譯為jar包;
  3. >
  4. clean會清除操作 ;

4.2 我們執行jar命令後,在libs目錄下找到生成的jar包。

4.3 執行命令列

java ->1.0-SNAPSHOT.jar cn.zyzpp.App

輸出結果:

5.打包web專案

新建Gradle專案時選擇web,點選war命令進行打包。

為什麼會有war命令,因為plugins方法閉包引數內呼叫id(“war”)方法。

6.projects、tasks

Gradle 裡的任何東西都是基於這兩個基礎概念:

  • projects ( 專案 )
  • tasks ( 任務 )

每一個構建都是由一個或多個 projects 構成的. 一個 project 到底代表什麼依賴於你想用 Gradle 做什麼. 舉個例子, 一個 project 可以代表一個 JAR 或者一個網頁應用.

每一個 project 是由一個或多個 tasks 構成的. 一個 task 代表一些更加細化的構建. 可能是編譯一些 >

7.自定義任務

首先應該明白,gradle自帶了很多task。

在build.gradle中新增自定義task很簡單,程式碼如下:

//自定義一個方法,這裡是建立目錄
def createDir = {
    path ->
        File file = new File(path);
        if (!file.exists()){
            file.mkdirs();
        }
}
//自定義第一個task任務
task makeGroovyDir(){
    def paths = ["src/main/groovy"];
    doFirst {
        paths.forEach(createDir);
    }
}
//自定義第二個task任務
task makeJavaDir(){
    dependsOn 'makeGroovyDir'   //該任務依賴於某個任務
    def paths = ["src/main/java2"];
    doFirst {
        paths.forEach(createDir);
    }
}

執行圖如下:

8.構建生命週期

初始化完成後的方法 -> 配置完成後的方法 -> 執行完成後的方法

9.依賴管理

幾乎所有的基於JVM的軟體專案都需要依賴外部類庫來重用現有的功能。自動化的依賴管理可以明確依賴的版本 ,解決因傳遞性依賴帶來的版本衝突。

9.1 依賴倉庫位置

工件座標 group name version

常用倉庫

1 mavenLocal() / mavenCentral() / jcenter

2 自定義maven倉庫

repositories {
    maven{
        url '私服地址一般放首位'
    }
    mavenLocal()    //本地倉庫
    mavenCentral()  //中央倉庫
}

3 檔案倉庫(不推薦使用)

9.2 依賴的傳遞性

b 依賴a 如果c依賴b 那麼c依賴a

9.3 依賴的階段

testCompile是在測試的編譯階段,其它如runtime等。

編譯階段的依賴在執行時也是存在的。典型的例子是JDBC驅動實現,專案主程式碼的編譯只需要jdk提供的jdbc的介面,只有在執行測試或者執行測試的時候才需要實現上述介面的jdbc的驅動。

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'org.jsoup', name: 'jsoup', version: '1.10.3'
}

10.版本衝突

檢視版本衝突,執行dependencies任務

1.gradle預設會使用高版本的依賴

2.取消預設策略,如果有版本衝突,直接讓其構建失敗

configurations.all{
    resolutionStrategy{
        failOnVersionConflict()
    }
}

3.排除傳遞性依賴(預設排除最低版本)

//排除哪個jar的依賴
compile('org.spring-core:3.6.3.Final'){
    //指定要排除的依賴的group和module=name,不指定版本,預設排除最低版本
    exclude group:'org.slf4j',module:'slf4j-api'
    //transitive=false//排除所有傳遞性依賴,比較少用
}

4.強制指定預設使用某個版本

configurations.all{
    resolutionStrategy{
        force 'org.slf4j:slf4j-api:1.7.24'
    }
}

備註:IDEA可能會不提示,但不要緊,依執行結果為據。

11.多專案構建

11.1 新建模組

我們新建一個web模組,新建成功後如下:

可以看到在新模組裡生成了一個build.gradle檔案,並且setting.gradle檔案中新增了include ‘web’語句。

11.2 依賴模組

我們可以再次新建model模組。如果我們想在model模組使用web模組的類,如何寫呢?

dependencies {
    compile project(":web") //這裡是模組名
    ...
}

現在通過gradle外掛,檢視到專案有root根模組,model模組,web模組。

11.3 全域性配置

我們可以在root根模組設定全域性配置,比如在root模組使用allprojects:

allprojects{
    apply plugin : 'java'
    sourceCompatibility = 1.8
}

去掉其它模組的 plugin : 'java',可以看到該模組依舊存在 jar 任務。

也可以使用subprojects配置這個專案的子專案:

subprojects {
    dependencies {
        compile 'ch.qos.logback:logback->
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
}

11.4 統一配置

統一專案的版本,只需要在專案目錄下新建gradle.properties檔案,寫入

group = 'cn.zyzpp'
version = '1.0-SNAPSHOT'

然後去掉其它配置檔案的該內容即可。

11.5 個性化配置

在web模組新增war外掛,只需要在web模組下的build.gradle寫入

plugins{
    id 'war'
}

11.6 總結

當多專案構建時,每個子專案下的配置只是對與根專案不同的個性化配置。

所有相同的配置,建議還是在根專案下配置。

12.自動化測試

如果在test目錄下編寫了測試程式碼,在build構建專案時會自動執行這些測試程式碼並生成一些類似報表的html或xml。如圖所示:

開啟該HTML如圖所示:

13.釋出

在專案的build.gradle中加入:

apply plugin: 'maven-publish'//新增maven釋出外掛
//配置釋出
publishing{
    //把什麼釋出到倉庫
    publications{
        //方法名自定義
        myPublish(MavenPublication){
            from components.java//java產生的輸出釋出到倉庫
        }
    }
    //釋出的位置
    repositories{
        maven{
            mame 'myRepo'
            url '私服地址,然後執行publish即可釋出到私服'
        }
    }
}

此時會看到Gradle project的選項卡的配置了釋出資訊的專案的Tasks下多出了publishing任務組,執行組下publishToMavenLocal即可釋出到本地倉庫,到本地倉庫即可看到釋出的資訊。其它命令:

  • publishes:釋出到本地maven倉庫
  • installs:釋出到依賴快取
  • uploads:釋出到遠端倉庫

14.常用語句

// 解決打包無main函式,不包含其它依賴
jar {
    manifest {
        attributes(
                "Manifest-Version": 1.0,
                "Main->: "cn.zyzpp.App")//修改此處
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    into('assets') {
        from 'assets'
    }
}
// 解決編譯GBK編碼問題
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

從Maven轉Gradle還是比較容易的。