2017年6月21日 星期三

[ Java 文章收集 ] 認識 Gradle - (3)Gradle 起手式

Source From Here 
前言 
前二篇介紹在 Gradle 前較廣泛使用的編譯工具 Ant 與 Maven。接下來的課程就會以 Gradle 為主。在正式進入 Gradle 教學的這篇,我們選擇以起手式的角度切入,先不去理解繁複的原理與暫時用不到的設計概念、中心思想,而是要使用編譯工具最重要的就是把專案編譯出來,並且它確實要能動。此篇教學的要點在帶領讀者:安裝、建立第一個 Java 專案、基本指令介紹與實作歷程回顧。 

此教學主要用到的資訊儘可能採用 Gradle 官方網站 的資料,它的官網已提供許多有用的資訊,向未接觸 Gradle 的讀者『導讀』這些材料是撰寫這系列教學的重要目標。 

安裝 Gradle 
Gradle 的安裝很容易,在使用者有安裝 JDK 1.5+ 以上版本,並設定好相關環境變數的前提下,只需由 Gradle 官網下載程式並將執行 script 或 batch file 設到 PATH 路徑內即可使用。進入網官首頁,就能看到很醒目的 Download 按鈕. 
* How to Install Gradle on CentOS 7

如果你的 JDK 已經安裝好, 下面的 shell 可以幫你快速安裝 Gradle (Under CentOS7): 
- installGradle.sh 
  1. #!/bin/bash  
  2. cd /root  
  3. 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`  
  4. gradle_version=`echo ${gradle_package} | cut -d "-" -f 1,2`  
  5. mkdir /opt/gradle  
  6. curl -L -Of http://services.gradle.org/distributions/${gradle_package}  
  7. unzip -oq ./${gradle_package} -d /opt/gradle  
  8. ln -sfnv ${gradle_version} /opt/gradle/latest  
  9. printf "export GRADLE_HOME=/opt/gradle/latest\nexport PATH=\$PATH:\$GRADLE_HOME/bin" > /etc/profile.d/gradle.sh  
  10. . /etc/profile.d/gradle.sh  
  11. hash -r ; sync  
  12. # check installation  
  13. gradle -v  
安裝完畢後, 檢查目前 Gradle 版本: 
# gradle -v

------------------------------------------------------------
Gradle 3.5.1
------------------------------------------------------------

Build time: 2017-06-16 14:36:27 UTC
Revision: d4c3bb4eac74bd0a3c70a0d213709e484193e251

Groovy: 2.4.10
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_121 (Oracle Corporation 25.121-b13)
OS: Linux 3.10.0-327.el7.x86_64 amd64

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 
  1. package tw.com.codedata;  
  2.   
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5.   
  6. public class HelloWorld {  
  7.   
  8.     static Log logger = LogFactory.getLog(HelloWorld.class);  
  9.   
  10.     public static void main(String[] args) {  
  11.         logger.info("Hello World");  
  12.     }  
  13.   
  14. }  
- log4j.properties 
  1. log4j.rootLogger=info, stdout, R  
  2.   
  3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  5. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n  
  6.   
  7. log4j.appender.R=org.apache.log4j.RollingFileAppender  
  8. log4j.appender.R.File=codedata.log  
  9. log4j.appender.R.Append=true  
  10. log4j.appender.R.layout=org.apache.log4j.PatternLayout  
  11. log4j.appender.R.layout.ConversionPattern=%p %t [%d{yy/MM/dd HH:mm:ss:SSS}] %c - %m%n  
build.gradle 內容為: 
  1. /* 引用 java plugin 獲得編譯 java 專案相關的 task $ */  
  2. apply plugin: 'java'   
  3.   
  4. /* 引用 application plugin 獲得執行 java 專案相關的 task $ */  
  5. apply plugin:'application'  
  6.   
  7. /* 執行 application plugin 用到的參數 $ */  
  8. mainClassName = "tw.com.codedata.HelloWorld"  
  9.   
  10. /* 設定 maven repository server $ */  
  11. repositories {  
  12.     mavenCentral()  
  13. }  
  14.   
  15. /* 宣告專案的相依函式庫 $ */  
  16. dependencies {  
  17.     compile group: 'commons-logging', name: 'commons-logging', version: '1.1.1'  
  18.     compile group: 'log4j', name: 'log4j', version: '1.2.16'  
  19. }  
使用 gradle 指令執行 run task: 
# gradle run
Starting a Gradle Daemon (subsequent builds will be faster)
:compileJava
Download https://repo1.maven.org/maven2/commons-logging/com....1.1/commons-logging-1.1.1.pom
...
:processResources
:classes
:run

INFO [main] (HelloWorld.java:11) - Hello World

BUILD SUCCESSFUL

Total time: 6.063 secs

可以觀察到它依序執行: 
1. compileJava
2. processResources
3. classes
4. run

這些 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
:help

Welcome to Gradle 3.5.1.

To run a build, run gradle  ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task

BUILD SUCCESSFUL

Total time: 0.547 secs

它提示使用者,gradle 需要指定 task,若你不知道該執行哪個 task 請使用 tasks,執行後可以看到許多的 task,它們以特定的群組為單位集合在一起: 

除了先前執行過的 run task,我們能試試由 tasks 查詢到的能執行的 task,例如 distZip

Gradle 產出的檔案通常在 build 目錄下,我在 build/distributions 下找到 zip 檔,它的內容如下: 

還能試試顯示相依性的 dependencies: 

dependencies 是個相當長的 task 名稱,Gradle 允許使用者使用縮寫的方式呼叫 task,例如: 
# gradle d
# gradle de
# gradle dep

上述的縮寫都會呼叫 dependencies,若是遇到無法判斷時,Gradle 會提供候選名單,例如只輸入 t 時,Gradle 無法確定你要執行 tasks 還是 test: 
# gradle t

FAILURE: Build failed with an exception. 

* What went wrong:
Task 't' is ambiguous in root project 'GradleLab'. Candidates are: 'tasks', 'test'.

* Try:
Run gradle tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.


BUILD FAILED

你需明確指定要 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?

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...