位元詩人 [Groovy] 程式設計教學:建置開發環境

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

本文會帶著各位讀者實際建置 Groovy 開發環境,做為日後撰寫 Groovy 程式的準備。

安裝 Java

由於 Groovy 運行在 Java 平台,要先安裝 Java 平台。該平台分為 JRE (註1) 和 JDK (註2) 兩種,前者只能用來執行 Java 程式,但沒有開發工具,所以要安裝 JDK。

(註1) Java SE Runtime Environment

(註2) Java SE Development Kit

在這篇文章撰寫時,JDK 長期支援版本 (註) 是 17。沒有特殊理由的話,使用 LTS 版本較佳。以目前的態勢來說,先在 OpenJDK 上運行 Java 和 Java 平台語言是較佳的選擇,必要時仍然可以回頭用 Oracle JDK。

(註) LTS (Long-Term Support)。比一般版本有更長的支援週期,就不需要頻繁地更動軟體版本

Windows

傳統的方式是下載 OpenJDK 17 安裝程式,按照步驟安裝即可,相信不會太困難。

不過,筆者建議用 Chocolatey (套件管理軟體) 來安裝。Chocolatey 將 GNU/Linux 上的套件管理的概念帶到 Windows 來,使用指令就可以安裝許多軟體。

安裝好 Chocolatey 後,繼續安裝 OpenJDK:

> choco install temurin17

Unix

不論是 macOS 還是 GNU/Linux,在 Unix 上建議用 SDKMAN 管理 Java 相關軟體。

透過 SDKMAN,可以在命令列安裝及管理數種 Java 平台語言、框架和工具,包括 Groovy 及 Gradle 在內。SDKMAN 以 Bash 寫成,僅依賴於一些 Unix 標準工具,使用上相當簡單。

安裝 SDKMAN:

$ curl -s "https://get.sdkman.io" | bash

SDKMAN 會自動修改 shell 設定檔,如果需要,也可自行手動修改。在 shell 設定檔加入以下內容:

#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="/Users/apple/.sdkman"
[[ -s "/Users/apple/.sdkman/bin/sdkman-init.sh" ]] && source "/Users/apple/.sdkman/bin/sdkman-init.sh"

用 SDKMAN 安裝 JDK:

$ sdk install java

安裝 Groovy

Windows

傳統的方法,也是透過安裝程式來安裝,請讀者自行完成。

不過,也可以用前述的 Chocolatey 安裝,會比較簡單:

> choco install groovy

Unix

承前文,用 SDKMAN 安裝 Groovy:

$ sdk install groovy

預設情形下,SDKMAN 會安裝最新穩定版本,應該可以符合大部分使用者的需求。

(選擇性) 安裝 Gradle

Gradle 是用來建 Groovy 專案 (註) 的編譯自動化軟體。剛學 Groovy 時不會馬上用到,但日後要建立有規模的 Groovy 程式時就會有用。

(註) 實際上可以建置多種語言的專案。包括但不限於 C++、Java、Groovy、Scala、Kotlin

Windows

用前述的 Chocolatey 安裝 Gradle:

> choco install gradle

Unix

承前文,用 SDKMAN 安裝 Gradle:

$ sdk install gradle

選擇編輯器

如果把 Groovy 當成類似於 PerlPythonRuby 的命令稿語言,使用 VS Code 這類編輯器即可,不一定要用正統的 Java IDE 來寫 Groovy 程式。

習慣使用 Java IDE 的讀者,可以從 NetBeansEclipseIntelliJ IDEA 中挑一個來用。目前來說,IntelliJ IDEA 的反應速度比較好,使用起來會比較順手。如果不想付費,可以先用 Community Edition。

檢查 Groovy 開發環境

在終端機輸入 groovy --version 指令:

> groovy --version
Groovy Version: 3.0.24 JVM: 17.0.13 Vendor: Eclipse Adoptium OS: Windows 11

如果有看到版本號,即是正確安裝;否則,要回頭檢查那個步驟錯誤。

透過本文的介紹,相信各位讀者都能順利建立開發環境。在下一篇文章中,我們將帶著讀者實際撰寫 Groovy 程式,並學習如何建立 Groovy 專案。

以 Gradle 建立 Groovy 專案

剛學 Groovy 時,我們只將 Groovy 程式寫在命令稿 (script) 中,對於簡單的程式這樣子還沒什麼問題,但是,當程式規模變大,我們就希望以專案管理 Groovy 程式碼。目前有幾種管理專案的方式:

  • 透過特定 IDE 來建立專案,如 Eclipse 或 IntelliJ IDEA
  • 透過不限於特定 IDE 的編譯工具,如 Maven 或 Gradle

雖然說前者對初學者來說比較簡單,以長遠的角度來說,還是要學 Gradle 等編譯工具,因為要和別人合作時,大家不一定都用同一種 IDE;日後要分享程式碼時,也傾向將其轉為 Maven 或 Gradle 專案。

根據程式的性質,可以將 Groovy 專案分為應用程式 (application) 和函式庫 (library) 兩類。前者可直接在電腦內執行,以達成某些特定的功能;後者無法直接執行,而是預先寫好一些程式碼,將其包裝起來,待其他應用程式 (或函式庫) 來呼叫。

一開始練習時,我們撰寫的都是直接在終端機執行的應用程式,不會馬上撰寫函式庫。

以 Gradle 建立 Groovy 專案:

$ mkdir myapp
$ cd myapp
$ gradle init --type groovy-application

Gradle 會詢問使用者幾個問題:

Welcome to Gradle 8.13!

Here are the highlights of this release:
 - Daemon JVM auto-provisioning
 - Enhancements for Scala plugin and JUnit testing
 - Improvements for build authors and plugin developers

For more details see https://docs.gradle.org/8.13/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)

Enter target Java version (min: 7, default: 21): 17

Project name (default: myapp):

Select application structure:
  1: Single application project
  2: Application and library project
Enter selection (default: Single application project) [1..2] 1

Select build script DSL:
  1: Kotlin
  2: Groovy
Enter selection (default: Groovy) [1..2] 2

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
 no

> Task :init
Learn more about Gradle by exploring our Samples at https://docs.gradle.org/8.13/samples/sample_building_groovy_applications.html

BUILD SUCCESSFUL in 1m 1s
1 actionable task: 1 executed

這裡的問題都很簡單,按照需求回答即可。

Gradle 最大的更動是可以從 Kotlin 和 Groovy 中擇一做為命令稿語言。既然這個系列的主題是 Groovy,當然選 Groovy。

建立完專案後,試著執行該專案:

> gradle run
Calculating task graph as no cached configuration is available for tasks: run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 1m 12s
2 actionable tasks: 2 executed
Configuration cache entry stored.

第一次執行該指令時,會耗費比較久的時間,因為需要下載一些檔案,第二次以後再執行就會比較快。

tree 指令觀察一下專案結構:

$ tree
├── app/
├── build/
├── gradle/
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

專案內有數個檔案,說明如下:

  • app/src/ 資料夾:實際撰寫程式碼的地方
  • app/build.gradle:設置編譯流程的命令稿
  • build/ 資料夾:編譯出的內容,該資料夾內的內容不宜手動處理,可用 Gradle 指令清空
  • gradle/ 資料夾:僅是用來將 Gradle 附帶到專案中,不需手工處理
  • gradlew 和 gradlew.bat:當系統上沒有 Gradle 時,可以用該命令稿代替,不需手工處理
  • setting.gradle:Gradle 專案的設定

通常,我們在將程式碼寫在 app/src 資料夾,僅在需要時去調整 app/build.gradle 和 setting.gradle 即可,其他的檔案和資料夾都不需更動。

加入 Fat JAR 支援

原先 Java 沒有模組的概念,後來出現 JAR 這種檔案格式,可用來代替模組。而 fat JAR 是指將所有相依的 JAR 重新打包在同一個 JAR 中,之後這個 JAR 就可以單獨使用。對於 Java 程式來說,fat JAR 很方便,只要將一個單一的 JAR 傳到另一台有裝 Java 平台的電腦,就可立即使用。

在我們前述的專案中,編譯出來的 JAR 不是 fat JAR。要透過外掛的功能才能編譯 fat JAR,所以我們要加入 shadow。在 build.gradle 的最上方加入以下敘述:

plugins {
  id("com.github.johnrengelman.shadow") version "8.1.1"
}

執行相關的任務:

> gradle shadowJar

編譯成功後,執行此 JAR 檔案:

> java -jar app\build\libs\app-all.jar
Hello World!

後記

說實在的,Gradle 對初學者來說不太容易學習,尤其對完全不熟 Groovy 的使用者,要馬上自在地讀和寫 Gradle 命令稿也有一定難度。

如果讀者覺得 Gradle 過難,不妨暫時先以單純的 Groovy 命令稿或是以 IDE 所建立的專案為主,待學習 Groovy 一段時間後,再回頭學 Gradle 會比較容易上手。

關於作者

位元詩人 (ByteBard) 是資訊領域碩士,喜歡用開源技術來解決各式各樣的問題。這類技術跨平台、重用性高、技術生命長。

除了開源技術以外,位元詩人喜歡日本料理和黑咖啡,會一些日文,有時會自助旅行。