Gradle - (1) 從零開始

起因

Build Tool我已經習慣用Maven了,在目前基本上沒有特別想換的念頭,大部份的需求都是符合的,沒有不足或不方便到一定要找其他解決方案,但是因為愈來愈多的Open Source,甚至Android都只用Gradle,在有點被半強迫下開始用Gradle。

我會試著用Maven的角度來介紹Gradle,最後也會試著比較相同功能,兩種不同的寫法。

本文原本是以Gradle 4.1版做為基礎所寫,但Gradle 5後更動不少,雖配合修正,但仍恐有未盡完善確認之處,還請見諒。

零、總結

重點寫在最前面,廢話不是我專長。

目的GradleMaven
安裝brew install gradlebrew install maven
建立空專案gradle init –type java-applicationmvn archetype:generate
可用的建構階段gradle tasks –allmvn help:describe -Dcmd=install
執行建構gradle buildmvn package
檢視Dependency Treegradle dependenciesmvn dependency:tree

一、安裝

使用Homebrew最方便,不過要先確認有JAVA_HOME的設定

brew install gradle

GRADLE_HOME加入環境變數

export GRADLE_HOME=`brew --prefix gradle`/libexec

確認安裝結果

$ gradle -v

------------------------------------------------------------
Gradle 5.6.2
------------------------------------------------------------

Build time:   2019-09-05 16:13:54 UTC
Revision:     55a5e53d855db8fc7b0e494412fc624051a8e781

Kotlin:       1.3.41
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.14 compiled on March 12 2019
JVM:          12.0.2 (Oracle Corporation 12.0.2+10)
OS:           Mac OS X 10.14.5 x86_64

一開始,其中的Groovy及Ant會是用安裝包裡內建的,與外部環境沒有關連。

二、建立基本Java Project

執行gradle init --type java-application,可以產生基本的Java Project,可以把gradle init --type ***當作是mvn archetype:generate--type後面的參數可使用不同類型的範本名稱。

$ gradle init --type java-application

產生的檔案如下

-rw-r--r--   1 elliot  staff   103 Sep 12 08:21 .gitignore
drwxr-xr-x   4 elliot  staff   128 Sep 12 08:20 .gradle
-rw-r--r--   1 elliot  staff  1154 Sep 12 08:21 build.gradle
drwxr-xr-x   3 elliot  staff    96 Sep 12 08:20 gradle
-rwxr-xr-x   1 elliot  staff  5960 Sep 12 08:20 gradlew
-rw-r--r--   1 elliot  staff  2942 Sep 12 08:20 gradlew.bat
-rw-r--r--   1 elliot  staff   351 Sep 12 08:21 settings.gradle
drwxr-xr-x   4 elliot  staff   128 Sep 12 08:21 src

重點放在build.gradlesettings.gradle上面,Gradle會參照build.gradle裡的描述來建構專案,而會將settings.gradle裡的設定引入build.gradle之中。

ps: Maven可用的完整指令

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart

其他可用的type可以參考 Gradle Build Types

三、build.gradle

先看看build.gradle

plugins {
    id 'java'
    id 'application'
}

repositories {
    jcenter()
}

dependencies {
    implementation 'com.google.guava:guava:28.0-jre'

    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2'
}

mainClassName = 'App'

1. plugin: id ‘java’

Gradle透過各種Plugin,來支援各種不同類型的程式語言建構工作,所以當看到plugins { id 'java'}時,可以知道,這個Project是一個Java Project.

目前直接支援的程式語言有javagroovyscalaantlr

Gradle的Plugin也像Maven一樣有分build或report類型,但表示法比較簡單,以Maven來說需要設定<build><plugins></plugins></build><reporting><plugins></plugins></reporting>兩處的plugin,Gradle就統一只用plugins即可

reference : Standard Gradle plugins

2. repositories

跟Maven相同,Gradle裡也能使用公用的library repository;基本上可以使用的設定有

設定值說明
mavenCentral()公開的Maven Repository
jcenter()Bintray’s JCenter
google()Goole Maven Repository
mavenLocal()Local 端的Maven Repositoy

其他ivy或自建的就先不提了。

3. dependencies

跟Maven一樣,也要區分是測試用的還是執行時用的,分類跟使用的Plugin有關,如果是Java的話,可以參考Grale Java Plugin: Dependency Management

至於Maven有哪些Scope,可以參考這裡Maven Dependency Scope

設定值說明
implementation同Maven compile,編譯,執行時使用
testImplementation同Maven test,編譯,執行Test時使用
runtimeOnly同Maven runtime,執行時使用

4. src

範本裡已有指定基本的src

└── src
    ├── main
    │   ├── java
    │   │   └── tw
    │   │       └── elliot
    │   │           └── App.java
    │   └── resources
    └── test
        ├── java
        │   └── tw
        │       └── elliot
        │           └── AppTest.java
        └── resources

跟用Maven建出來的相同,可以有預設的package名稱。

需要修改的話,Gradle可以用sourceSets來指定

sourceSets {
    main {
        java {
            srcDirs = ['src/java']
        }
        resources {
            srcDirs = ['src/resources']
        }
    }
}

可用的sourceSets可以參考Java Project Layout,注意的是,這是java project的layout.

5. build

Maven是依據著Lifecycle跟Phase,還有pom.xml中設定的package類型來做建構,有哪些Lifecycle可參考Maven LifecyclesMaven Package Binding,實際執行上比較大的影響是package類型,無論是jarwar還是ear,要完整建構的話可以只要下mvn package即可。。

而Gradle也有Lifecycle,但Gradle實際執行的是所謂的task,會依據apply plugin而改變,所以要如何來build,是要參考plugin裡的說明,例如Gradle Java Plugin裡,就會有註明相關的lifecycle task有哪些,像是有buildtestjar等,所以jarwar或是ear,要建構可能會有區分,實際上全部用gradle build基本上也沒問題。

比較快的方式是執行gradle tasks --all,可以馬上看到現有可執行的tasks

$ gradle tasks --all

> Task :tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Application tasks
-----------------
run - Runs this project as a JVM application

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

.....

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

實際執行gradle -i build看看,多一個-i的參數是為了可以看到實際過程中執行的各個task

> Configure project :
> Task :compileJava
> Task :processResources
> Task :classes
> Task :jar
> Task :startScripts
> Task :distTar
> Task :distZip
> Task :assemble
> Task :compileTestJava
> Task :processTestResources
> Task :testClasses
> Task :test
> Task :check
> Task :build
BUILD SUCCESSFUL in 0s

至於想瞭解Maven有哪些phase可用,可以執行mvn help:describe -Dcmd=install

$ mvn help:describe -Dcmd=install
....
It is a part of the lifecycle for the POM packaging 'jar'. This lifecycle includes the following phases:
* validate: Not defined
* initialize: Not defined
* generate-sources: Not defined
* process-sources: Not defined
* generate-resources: Not defined
* process-resources: org.apache.maven.plugins:maven-resources-plugin:2.6:resources
* compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
* process-classes: Not defined
* generate-test-sources: Not defined
* process-test-sources: Not defined
* generate-test-resources: Not defined
* process-test-resources: org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
* test-compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
* process-test-classes: Not defined
* test: org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
* prepare-package: Not defined
* package: org.apache.maven.plugins:maven-jar-plugin:2.4:jar
* pre-integration-test: Not defined
* integration-test: Not defined
* post-integration-test: Not defined
* verify: Not defined
* install: org.apache.maven.plugins:maven-install-plugin:2.4:install
* deploy: org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy

Reference


 Github Sample

 
 4.6 中文版使用指南

One thought to “Gradle - (1) 從零開始”

  1. 自動引用通知: 201909雜談 | 起風前的相遇

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料