[Groovy] 程序设计教学:写第一个 Groovy 程序

PUBLISHED ON JAN 7, 2019 — PROGRAMMING

    在上一篇文章中,我们谈到关于 Groovy 开发环境的建置,相信各位读者都能顺利建置环境。接着,我们要开始实际撰写 Groovy 程序及建立 Groovy 项目。

    Hello World

    一般程序语言的书,都先用 Hello World 程序熟悉撰写程序的流程,本文也不例外。首先,用编辑器或 IDE 建立 hello.groovy 文字文件,并加入以下内容:

    public class Hello {
        public static void main(String[] args) {
            System.out.println("Hello World");
        }
    }

    执行此程序:

    $ groovy hello.groovy
    Hello World

    眼尖的读者可发现,这根本就是 Java 版的 Hello World 程序。这是由于 Groovy 刻意在语法上接近 Java,虽然不是 100% 兼容 Java ,很多 Java 的语法在 Groovy 内也通用。不过,Groovy 有更简洁的写法,将 hello.groovy 修改如下:

    println "Hello World"

    这个 Groovy 程序也可以执行,而且和先前的程序效果相同。这是因为 Groovy 设计上接近 Python 及 Ruby,不需要主函式,而以脚本本身做为程序的进入点。由于 Groovy 程序要在 Java 平台上运行,在 Groovy 内部,其实还是将这个程序转为有主函式的版本,但平常使用下,不需要知道转换的细节。

    Groovy Shell

    有时候,我们只是想尝试一下 Groovy 语法,但不想开编辑器,这时候,可以用 groovysh 指令进入 Groovy Shell。这是一个交互式的 REPL (Read-Evaluate-Print-Loop) 环境,在一些现代的主流程序语言中很流行,像是 Python 或 Ruby 都有这种模式。

    在终端机输入 groovysh 进入 Groovy Shell:

    $ groovysh
    Groovy Shell (2.4.12, JVM: 1.8.0_141)
    Type ':help' or ':h' for help.
    -------------------------------------------------------------------------------
    groovy:000>
    

    在大于 > 符号后即可输入 Groovy 程序代码,前缀冒号的指令则是 Groovy Shell 特有的指令,像是输入 :exit 或是 :quit 即可离开 Groovy Shello。

    我们看一下以下两行 Groovy Shell 命令:

    groovy:000> "Hello World"
    ===> Hello World
    groovy:000> println "Hello World"
    Hello World
    ===> null
    groovy:000>
    

    在第一个指令中,我们仅输入 “Hello World” 字串,此环境就回传 “Hello World” 字串;但在第二个指令中,系统先印出字串,却回传 null (空值),因为在 Groovy 程序中,其实 println 指令没有回传值,故回传 null

    我们也可以把 Groovy 当成简易型计算机:

    groovy:000> (1 + 2) * (4 - 2)
    ===> 6
    

    当然,Groovy Shell 主要只是用来试语法,无法取代真正的开发环境。

    Groovy Console

    如果觉得前述的 Groovy Shell 是终端机软件,用得不习惯,也可以用图形接口的 Groovy Console,这个软件可以当成简易的 Groovy 编辑器,只是要尝试一下语法可以使用。

    Groovy web console

    Groovy web console 是一个网站,可以在线练习 Groovy 语法,偶尔要试语法时,也是另一个不错的选择,读者可自行尝试。

    建立项目

    先前,我们只将 Groovy 程序写在脚本 (script) 中,对于简单的文件这样子还没什么问题,但是,当程序规模变大,我们就希望以项目管理 Groovy 程序代码。目前有几种管理项目的方式:

    • 透过特定 IDE 来建立项目,如 Eclipse 或 IntelliJ IDEA
    • 透过不限于特定 IDE 的编译工具,如 Maven 或 Gradle

    虽然说前者对初学者来说比较简单,以长远的角度来说,还是要学 Gradle 等编译工具,因为要和别人合作时,大家不一定都用同一种 IDE;日后要分享程序代码时,也倾向将其转为 Maven 或 Gradle 项目。目前 Java 生态圈主流的编译工具是 Gradle,同时也有项目管理的功能;Gradle 也可以用来建立 Groovy 项目。

    根据程序的性质,可以将 Groovy 项目分为两类:

    • 应用程序 (application) *函数库 (library)

    前者可直接在电脑内执行,以达成某些特定的功能;后者无法直接执行,而是预先写好一些程序代码,将其包装起来,待其他应用程序 (或函式库) 来调用。一开始练习时,我们撰写的都是直接在终端机执行的应用程序,不会马上撰写函式库。

    以 Gradle 建立 Groovy 项目,以类 Unix 系统为例:

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

    若读者是用 Windows 系统,可用以下等效的指令:

    C:\> md myapp
    C:\> cd myapp
    C:\> gradle init --type groovy-application

    建立完项目后,试着执行该项目:

    $ gradle run
    
    > Task :run
    Hello world.
    
    BUILD SUCCESSFUL in 0s
    2 actionable tasks: 1 executed, 1 up-to-date

    第一次执行该指令时,会耗费比较久的时间,因为需要下载一些文件,第二次以后再执行就会比较快。

    tree 指令观察一下项目结构:

    $ tree
    ├── build/
    ├── build.gradle
    ├── gradle/
    ├── gradlew
    ├── gradlew.bat
    ├── settings.gradle
    └── src
        ├── main
        │   └── groovy
        │       └── App.groovy
        └── test
            └── groovy
                └── AppTest.groovy

    项目内有数个文件,说明如下:

    • build/ 数据夹:编译出的内容,该数据夹内的内容不宜手动处理,可用 Gradle 指令清空
    • *build.gradle*:用来管理 Gradle 项目的主要脚本
    • gradle/ 数据夹:仅是用来将 Gradle 附带到项目中,不需手工处理
    • gradlew 和 gradle.bat:当系统上没有 Gradle 时,可以用该脚本代替,不需手工处理
    • *setting.gradle*:一些 Gradle 项目的设定
    • src/ 数据夹:实际撰写程序代码的地方

    通常,我们在将程序代码写在 src/ 数据夹即可,仅在需要时去调整 build.gradle 和 setting.gradle 即可,其他的文件和数据夹都不需更动。

    加入 Fat JAR 支援

    原先 Java 没有模块的概念,后来出现 JAR 这种文件格式,可用来代替模块。而 fat JAR 是指将所有相依的 JAR 重新打包在同一个 JAR 中,之后这个 JAR 就可以单独使用。对于 Java 程序来说,fat JAR 很方便,只要将一个单一的 JAR 传到另一台有装 Java 平台的电脑,就可立即使用。

    在我们前述的项目中,默认的 JAR 不是 fat JAR,要透过外挂的功能才能达成,所以我们要加入 shadow JAR 这个外挂。在 build.gradle 的最上方加入以下叙述:

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1'
        }
    }
    
    apply plugin: 'com.github.johnrengelman.shadow'

    执行相关的任务:

    $ gradle shadowJar

    编译成功后,执行此 JAR 文件:

    $ java -jar build/libs/myapp-all.jar
    Hello World.

    说实在的,Gradle 对初学者来说不太容易学习,尤其对完全不熟 Groovy 的使用者,要马上自在地读和写 Gradle 脚本也有一定难度。如果读者觉得 Gradle 过难,不妨暂时先以单纯的 Groovy 脚本或是以 IDE 所建立的项目为主,待学习 Groovy 一段时间后,再回头学 Gradle 会比较容易上手。

    经过本文的介绍,相信各位读者已经有一些撰写 Groovy 程序的经验。接下来,在后续的文章中,我们会开始介绍 Groovy 的语法。

    TAGS: GROOVY, JAVA
    你或许对以下产品有兴趣
    All code in the website is licensed under Apache 2.0 unless otherwise mentioned.