前言
前二篇介紹在 Gradle 前較廣泛使用的編譯工具 Ant 與 Maven。接下來的課程就會以 Gradle 為主。在正式進入 Gradle 教學的這篇,我們選擇以起手式的角度切入,先不去理解繁複的原理與暫時用不到的設計概念、中心思想,而是要使用編譯工具最重要的就是把專案編譯出來,並且它確實要能動。此篇教學的要點在帶領讀者:安裝、建立第一個 Java 專案、基本指令介紹與實作歷程回顧。
此教學主要用到的資訊儘可能採用 Gradle 官方網站 的資料,它的官網已提供許多有用的資訊,向未接觸 Gradle 的讀者『導讀』這些材料是撰寫這系列教學的重要目標。
安裝 Gradle
Gradle 的安裝很容易,在使用者有安裝 JDK 1.5+ 以上版本,並設定好相關環境變數的前提下,只需由 Gradle 官網下載程式並將執行 script 或 batch file 設到 PATH 路徑內即可使用。進入網官首頁,就能看到很醒目的 Download 按鈕.
如果你的 JDK 已經安裝好, 下面的 shell 可以幫你快速安裝 Gradle (Under CentOS7):
- installGradle.sh
- #!/bin/bash
- cd /root
- gradle_package=`curl -s https://services.gradle.org/distributions/ --list-only | sed -n 's/.*\(gradle-.*.all.zip\).*/\1/p' | egrep -v "milestone|rc" | head -1`
- gradle_version=`echo ${gradle_package} | cut -d "-" -f 1,2`
- mkdir /opt/gradle
- curl -L -Of http://services.gradle.org/distributions/${gradle_package}
- unzip -oq ./${gradle_package} -d /opt/gradle
- ln -sfnv ${gradle_version} /opt/gradle/latest
- printf "export GRADLE_HOME=/opt/gradle/latest\nexport PATH=\$PATH:\$GRADLE_HOME/bin" > /etc/profile.d/gradle.sh
- . /etc/profile.d/gradle.sh
- hash -r ; sync
- # check installation
- gradle -v
Gradle 提供的版本資訊內容,有它釋出的時間與對應至版本控制系統的 Revision 代號。另外,還有 Groovy、Ant、Ivy 與 JVM 的版本。Gradle 並不是重無到有獨立建構出一套完整的專案編譯工具,它利用 Ant 與 Ivy 這些既有的編譯工具與相依性管理機制來執行主要的編譯工作,並運用 Groovy 客製化一套 Domain Specific Language (DSL),讓使用 Gradle 的開發者能用撰寫 Script 的方式寫出期望的編譯方式。
Groovy 是執行在 JVM 上的 Scripting Language,對於編寫 Gradle Script 用到的部分並不會太高深,有興趣更加深入 Groovy 的寫法的開發者可以參考它官方的文件 Groovy Getting Started Guide,目前我們還沒有要深入 Groovy 的種種特點,只要先記得它是 Gradle 的 DSL 即可。DSL 直譯成中文為『領域特定語言』,它是用在特定領域的,以我們現在的例子它用在 Building Tool 的領域。如同 SQL 也是一種領域特定語言,用在資料庫查詢領域。簡而言之,它們將語言的功能與目的有著特定的意圖,相較於 Java 就沒特定的意圖是屬於泛用型的語言。你也能用 Java 來實作編譯工作,但它並沒有事先定義實作『編譯工作』的常用元件,寫起來就比較原始且麻煩。換言之,用 Gradle 的 DSL 就事先定義了許多常用的元件,開發者可以方便地重複使用它,並加上一些針對專案需要客製的部分即可。
第一個 Gradle 專案
繼續沿用前二個系列的 Hello World,目錄結構如下:
HelloWorld.java 原始碼與 log4j.properties 設定檔內容如下:
- HelloWorld.java
- package tw.com.codedata;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public class HelloWorld {
- static Log logger = LogFactory.getLog(HelloWorld.class);
- public static void main(String[] args) {
- logger.info("Hello World");
- }
- }
- log4j.rootLogger=info, stdout, R
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
- log4j.appender.R=org.apache.log4j.RollingFileAppender
- log4j.appender.R.File=codedata.log
- log4j.appender.R.Append=true
- log4j.appender.R.layout=org.apache.log4j.PatternLayout
- log4j.appender.R.layout.ConversionPattern=%p %t [%d{yy/MM/dd HH:mm:ss:SSS}] %c - %m%n
- /* 引用 java plugin 獲得編譯 java 專案相關的 task $ */
- apply plugin: 'java'
- /* 引用 application plugin 獲得執行 java 專案相關的 task $ */
- apply plugin:'application'
- /* 執行 application plugin 用到的參數 $ */
- mainClassName = "tw.com.codedata.HelloWorld"
- /* 設定 maven repository server $ */
- repositories {
- mavenCentral()
- }
- /* 宣告專案的相依函式庫 $ */
- dependencies {
- compile group: 'commons-logging', name: 'commons-logging', version: '1.1.1'
- compile group: 'log4j', name: 'log4j', version: '1.2.16'
- }
可以觀察到它依序執行:
這些 task 命名與先前介紹的 Maven Build Phase 相似,不過實際上它採用的是 Ant Target Depdenency 概念,執行某個 task 前,要先執行過一些指定的 task。無論它採用何種實作方式,使用者只要知道目標是執行 run task 即可,該執行的相關 task 都會被執行。回頭看看 build.gradle,使用 DSL 來撰寫 Build Script 相較於 Maven 用 XML 來描述專案狀態或覆寫既有設定,它顯得更為簡易。它的『擴充』方式不是依賴在 Build Phase 綁定新的 Plugin Goal,而是採用像 Ant Build File 相依的 Import 機制,使用 apply指定要新增的 Plug In,理解起來更為直覺。
認識 Gradle 指令
在起手式的最後,讀者可先認識一些基本的指令。先由什麼參數都不加開始,在 Gradle 專案路徑(含有 build.gradle 的路徑)下,執行 gradle:
它提示使用者,gradle 需要指定 task,若你不知道該執行哪個 task 請使用 tasks,執行後可以看到許多的 task,它們以特定的群組為單位集合在一起:
除了先前執行過的 run task,我們能試試由 tasks 查詢到的能執行的 task,例如 distZip:
Gradle 產出的檔案通常在 build 目錄下,我在 build/distributions 下找到 zip 檔,它的內容如下:
還能試試顯示相依性的 dependencies:
dependencies 是個相當長的 task 名稱,Gradle 允許使用者使用縮寫的方式呼叫 task,例如:
上述的縮寫都會呼叫 dependencies,若是遇到無法判斷時,Gradle 會提供候選名單,例如只輸入 t 時,Gradle 無法確定你要執行 tasks 還是 test:
你需明確指定要 ta 或是 te,給予足夠的縮寫長度讓它能判斷。
Supplement
* 認識 Gradle - (4)看懂 Gradle Script
* FAQ - Use Java class in Gradle build script
* FAQ - How to add local .jar file dependency to build.gradle file?
沒有留言:
張貼留言