天天看點

最新版gradle安裝使用簡介簡介安裝gradle和解決gradle安裝的問題Gradle特性Gradle Wrapper一個簡單的build.gradlegradle使用maven倉庫總結

簡介

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

最新版gradle安裝使用簡介簡介安裝gradle和解決gradle安裝的問題Gradle特性Gradle Wrapper一個簡單的build.gradlegradle使用maven倉庫總結

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替換成為

: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的例子:

最新版gradle安裝使用簡介簡介安裝gradle和解決gradle安裝的問題Gradle特性Gradle Wrapper一個簡單的build.gradlegradle使用maven倉庫總結

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安裝使用簡介簡介安裝gradle和解決gradle安裝的問題Gradle特性Gradle Wrapper一個簡單的build.gradlegradle使用maven倉庫總結

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/

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

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

繼續閱讀