最新版gradle安裝使用簡介

簡介

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的各種用法,敬請期待。


本文分享自微信公衆號 - 程序那些事(flydean-tech)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章