最新版gradle安裝使用簡介

flydean發表於2021-02-07

簡介

gradle的最新版本是6.7,從2009年的第一個版本,到2020年的6.7,已經發展了11年了。gradle是作為android的官方構建工具引入的,除了java,它還能夠支援多種語言的構建,所以用途非常廣泛。

gradle是開源的構建工具,你可以使用groovy或者kotlin來編寫gradle的指令碼,所以說gradle是一個非常強大的,高度定製化的和非常快速的構建工具。

根據我的瞭解,雖然gradle非常強大,但是對於java程式設計師來說,一般還是都使用的maven,或者同時提供maven和gradle兩種構建方式。

為什麼會這樣呢?個人覺得有兩個原因:

第一個原因是gradle安裝檔案和依賴包的網路環境,如果單單依靠國內的網路環境的話,非常難安裝完成。

第二個原因就是gradle中需要自己編寫構建指令碼,相對於純配置的指令碼來說,比較複雜。

安裝gradle和解決gradle安裝的問題

gradle需要java8的支援,所以,你首先需要安裝好JDK8或者以上的版本。

❯ java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

安裝gradle有兩種方式,一種就是最簡單的從官網上面下載安裝包。然後解壓在某個目錄,最後將PATH指向該目錄下的bin即可:

❯ mkdir /opt/gradle
❯ unzip -d /opt/gradle gradle-6.7-bin.zip
❯ ls /opt/gradle/gradle-6.7
LICENSE  NOTICE  bin  README  init.d  lib  media

export PATH=$PATH:/opt/gradle/gradle-6.7/bin

如果你想使用包管理器,比如MAC上面的brew來進行管理的話,則可以這樣安裝:

brew install gradle

但是這樣安裝很有可能在下載gradle安裝包的時候卡住。

==> Downloading https://services.gradle.org/distributions/gradle-6.4.1-bin.zip
##O#- #

怎麼辦呢?

這時候我們需要自行下載gradle-6.4.1-bin.zip安裝包,然後將其放入http伺服器中,讓這個壓縮包可以通過http協議來訪問。

簡單點的做法就是將這個zip檔案拷貝到IDEA中,利用IDEA本地伺服器的預覽功能,獲得zip的http路徑,比如:http://localhost:63345/gradle/gradle-6.7-all.zip.

接下來就是最精彩的部分了,我們需要修改gradle.rb檔案:

brew edit gradle

使用上面的命令可以修改gracle.rb檔案,我們替換掉下面的一段:

  homepage "https://www.gradle.org/"
  url "https://services.gradle.org/distributions/gradle-6.7-all.zip"
  sha256 "0080de8491f0918e4f529a6db6820fa0b9e818ee2386117f4394f95feb1d5583"

url替換成為http://localhost:63345/gradle/gradle-6.7-all.zip,而sha256可以使用 sha256sum gradle-6.7-all.zip這個命令來獲取。

替換之後,重新執行brew install gradle即可安裝完成。

安裝完畢之後,我們使用gradle -v命令可以驗證是否安裝成功:

gradle -v

Welcome to Gradle 6.7!

Gradle特性

gradle作為一種新的構建工具,因為它是依賴於groovy和kotlin指令碼的,基於指令碼的靈活性,我們通過自定義指令碼基本上可以做任何想要的構建工作。

雖然說gradle可以做任何構建工作,但是gradle現在還是有一定的限制,那就是專案的依賴專案前只支援於maven和Ivy相容的儲存庫以及檔案系統。

gradle通過各種預定義的外掛,可以輕鬆的構建通用型別的專案,並且支援自定義的外掛型別。

另外一個非常重要的特性是gradle是以任務為基礎的,每一個build都包含了一系列的task,這些task又有各自的依賴關係,然後這些task一起構成了一個有向無環圖Directed Acyclic Graphs (DAGs)。

有了這個DAG,gradle就可以決定各個task的順序,並執行他們。

我們看兩個task DAG的例子,一個是通用的task,一個是專門的編譯java的例子:

task可以依賴task,我們看個例子:

task hello {
    doLast {
        println 'Hello world!'
    }
}
task intro {
    dependsOn hello
    doLast {
        println "I'm Gradle"
    }
}

一個task可以包含Actions,inputs和Outputs。根據需要這些型別可以自由組合。

標準task

Gradle包含了下面7種標準的task:

  • clean :用來刪除build目錄和裡面的一切。

  • check:這是一個生命週期任務,通常做一些驗證工作,比如執行測試任務等。

  • assemble :這是一個生命週期任務,用來生成可分發的檔案,比如jar包。

  • build: 也是一個生命週期任務,用來執行測試任務和生成最後的production檔案。通常我們不在build中直接做任何特定的任務操作,它一般是其他任務的組合。

  • buildConfiguration: 組裝configuration中指定的archives。

  • uploadConfiguration: 除了執行buildConfiguration之外,還會執行上傳工作。

  • cleanTask: 刪除特定的某個task的執行結果。

Build phases

一個gradle的build包含了三個phases:

  • Initialization: 初始化階段。gradle支援一個或者多個project的build。在初始化階段,gradle將會判斷到底有哪些project將會執行,並且為他們分別建立一個project例項。

  • Configuration: 配置階段。gradle將會執行build指令碼,然後分析出要執行的tasks。

  • Execution: 執行階段。gradle將會執行configuration階段分析出來的tasks。

Gradle Wrapper

上面講的是gradle的手動安裝,如果是在多人工作的環境中使用了gradle,有沒有什麼辦法可以不用手動安裝gradle就可以自動執行gradle程式呢?

方法當然有,那就是gradle wrapper:

gradle wrapper是一個工具,通過它我們可以方便的對本地的gradle進行管理。

上圖列出了gradle wrapper的工作流程,第一步是去下載gradle的安裝檔案,第二步是將這個安裝檔案解壓到gradle的使用者空間,第三步就是使用這個解壓出來的gradle了。

我們先看下怎麼建立gradle wrapper:

雖然Gradle wrapper的作用是幫我們下載和安裝gradle,但是要生成gradle wrapper需要使用gradle命令才行。也就是說有了wrapper你可以按照成功gradle,有了gradle你才可以生成gradle wrapper。

假如我們已經手動按照好了gradle,那麼可以執行下面的命令來生成gradle wrapper:

$ gradle wrapper
> Task :wrapper

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

先看下生成出來的檔案結構:

.
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat

gradle/wrapper/gradle-wrapper.properties 是 wrapper的配置檔案,我們看下里面的內容:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

其中distributionUrl就是我們要下載的gradle的路徑,其他的配置是gradle的安裝目錄。

一般來說有兩種安裝檔案型別:bin和all。bin和all的區別在於,bin只有安裝檔案,而all還包含了gradle的文件和樣例程式碼。

我們可以通過--distribution-type引數來修改安裝檔案的型別。此外還有 --gradle-version ,--gradle-distribution-url和--gradle-distribution-sha256-sum 這幾個引數可以使用。

$ gradle wrapper --gradle-version 6.7 --distribution-type all
> Task :wrapper

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

除了配置檔案之外,我們還有3個檔案:

  • gradle-wrapper.jar: wrapper業務邏輯的實現檔案。

  • gradlew, gradlew.bat :使用wrapper執行build的執行檔案。也就是說我們可以使用wrapper來執行gradle的build任務。

wrapper的使用

我們可以這樣使用gradlew,來執行build:

gradlew.bat build

注意,如果你是第一次在專案中執行build命令的話,將會自動為你下載和安裝gradle。

wrapper的升級

如果我們想要升級gradle的版本,也很簡單:

./gradlew wrapper --gradle-version 6.7

或者直接修改 gradle-wrapper.properties 也可以。

一個簡單的build.gradle

我們看一個非常簡單的gradle的例子:

plugins {
    id 'application' 
}

repositories {
    jcenter() 
}

dependencies {
    testImplementation 'junit:junit:4.13' 

    implementation 'com.google.guava:guava:29.0-jre' 
}

application {
    mainClass = 'demo.App' 
}

上面我們需要安裝一個application plugin,使用的是jcenter的依賴倉庫,還指定了幾個具體的依賴項。最後,指明瞭我們應用程式的mainClass。

gradle使用maven倉庫

build.gradle中的repositories指明的是使用的倉庫選項。

預設情況下gradle有自己的本地倉庫,一般在~/.gradle目錄下面,如果我們之前用的是maven倉庫,那麼在本地的maven倉庫中已經存在了很多依賴包了,如何重用呢?

我們可以這樣修改repositories:

    mavenLocal()
    mavenCentral()

這樣的話, 就會優先從maven的倉庫中查詢所需的jar包。

總結

本文只是一個很簡單的gradle介紹,讓大家對gradle有一個基本的瞭解,後面我們會詳細的介紹gradle的各種用法,敬請期待。

本文已收錄於 http://www.flydean.com/gradle-kick-off/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!

相關文章