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. classes會將檔案轉為class檔案;
  4. clean會清除操作 ;

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

4.3 執行命令列

java -classpath build/libs/useGradle-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 代表一些更加細化的構建. 可能是編譯一些 classes, 建立一個 JAR, 生成 javadoc, 或者生成某個目錄的壓縮檔案.

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 依賴倉庫位置

工件座標 goup 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-classic:1.2.1'
        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-Class": "cn.zyzpp.App")//修改此處
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    into('assets') {
        from 'assets'
    }
}
// 解決編譯GBK編碼問題
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}