起因
Build Tool我已經習慣用Maven了,在目前基本上沒有特別想換的念頭,大部份的需求都是符合的,沒有不足或不方便到一定要找其他解決方案,但是因為愈來愈多的Open Source,甚至Android都只用Gradle,在有點被半強迫下開始用Gradle。
我會試著用Maven的角度來介紹Gradle,最後也會試著比較相同功能,兩種不同的寫法。
本文原本是以Gradle 4.1版做為基礎所寫,但Gradle 5後更動不少,雖配合修正,但仍恐有未盡完善確認之處,還請見諒。
零、總結
重點寫在最前面,廢話不是我專長。
| 目的 | Gradle | Maven |
|---|---|---|
| 安裝 | brew install gradle | brew install maven |
| 建立空專案 | gradle init –type java-application | mvn archetype:generate |
| 可用的建構階段 | gradle tasks –all | mvn help:describe -Dcmd=install |
| 執行建構 | gradle build | mvn package |
| 檢視Dependency Tree | gradle dependencies | mvn 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.gradle及settings.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.
目前直接支援的程式語言有java、groovy、scala、antlr。
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 Lifecycles及Maven Package Binding,實際執行上比較大的影響是package類型,無論是jar、war還是ear,要完整建構的話可以只要下mvn package即可。。
而Gradle也有Lifecycle,但Gradle實際執行的是所謂的task,會依據apply plugin而改變,所以要如何來build,是要參考plugin裡的說明,例如Gradle Java Plugin裡,就會有註明相關的lifecycle task有哪些,像是有build、test、jar等,所以jar、war或是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
One thought to “Gradle - (1) 從零開始”