CLOVER🍀

That was when it all began.

GradleでGroovyを使う

Gradleで「Hello World」をするのにJavaを使ったわけですが、そもそもユーザガイドの最初がJavaから入っているわけで、Gradleのスタンス的には

GradleはGroovyで書かれているけど、ビルドツールとしてはJava標準でGroovyもサポートしてるよ

くらいなのかもしれませんね。

では、ユーザガイドを参考にして、やってみましょう。
http://www.gradle.org/docs/current/userguide/tutorial_groovy_projects.html

Groovy用のプロジェクトを作る

まずは、ディレクトリ作成。

$ mkdir hello-gradle-groovy
$ cd hello-gradle-groovy/
$ mkdir -p src/main/groovy

ソースファイルの配置先は、Groovyの場合「src/main/groovy」ですね。

build.gradleの中身は、こんな感じです。

apply plugin: 'groovy'

では、サンプルとなるGroovyソースを用意してみます。
src/main/groovy/HelloGradle.groovy

class HelloGradle {
    static void main(String[] args) {
        println("Hello World")
        println("Groovy Version = ${GroovySystem.version}")
    }
}

では、ビルド。

$ gradle build
:compileJava UP-TO-DATE
:compileGroovy

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileGroovy'.
> You must assign a Groovy library to the 'groovy' configuration.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 6.218 secs

おや、失敗しました。「Groovyの設定してないよ!」と言ってます。…そうなの?デフォルト設定で動くものじゃないんだ。

というわけで、ユーザガイドに従いGroovyの設定をしてみます。build.gradleを修正。

apply plugin: 'groovy'

repositories {
    mavenCentral()
}

dependencies {
    groovy group: 'org.codehaus.groovy', name: 'groovy', version: '2.0.1'
}

repositoriesとdependenciesを追加しました。repositoriesはMavenのCentralリポジトリしか書いてないので、要らないんじゃ?と思いましたが、サンプルがそう書いていることから予想できるように、書かないと失敗します…。

この辺、ホントにGroovyをビルドプロセスでネイティブサポートしてますというよりは、ただのライブラリとしてしか見てないんだな〜っていう姿勢がよくわかりますね。

では、ビルド〜。

$ gradle build
:compileJava UP-TO-DATE
:compileGroovy
Download http://repo1.maven.org/maven2/org/codehaus/groovy/groovy/2.0.1/groovy-2.0.1.pom
> Building > :compileGroovy > Resolving dependencies ':compile' > 15 KB/15 KB doDownload http://repo1.maven.org/maven2/antlr/antlr/2.7.7/antlr-2.7.7.pom
> Building > :compileGroovy > Resolving dependencies ':compile' > 632 B/632 B doDownload http://repo1.maven.org/maven2/org/ow2/asm/asm-tree/4.0/asm-tree-4.0.pom
> Building > :compileGroovy > Resolving dependencies ':compile' > 2 KB/2 KB downDownload http://repo1.maven.org/maven2/org/ow2/asm/asm-parent/4.0/asm-parent-4.0.pom
> Building > :compileGroovy > Resolving dependencies ':compile' > 5 KB/5 KB downDownload http://repo1.maven.org/maven2/org/ow2/ow2/1.3/ow2-1.3.pom
> Building > :compileGroovy > Resolving dependencies ':compile' > 9 KB/9 KB downDownload http://repo1.maven.org/maven2/org/ow2/asm/asm-commons/4.0/asm-commons-4.0.pom
> Building > :compileGroovy > Resolving dependencies ':compile' > 2 KB/2 KB downDownload http://repo1.maven.org/maven2/org/ow2/asm/asm/4.0/asm-4.0.pom
> Building > :compileGroovy > Resolving dependencies ':compile' > 1 KB/1 KB downDownload http://repo1.maven.org/maven2/org/ow2/asm/asm-util/4.0/asm-util-4.0.pom
> Building > :compileGroovy > Resolving dependencies ':compile' > 1 KB/2 KB downDownload http://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/4.0/asm-analysis-4.0.pom
> Building > :compileGroovy > Resolving dependencies ':compile' > 1 KB/2 KB downDownload http://repo1.maven.org/maven2/org/codehaus/groovy/groovy/2.0.1/groovy-2.0.1.jar
Download http://repo1.maven.org/maven2/antlr/antlr/2.7.7/antlr-2.7.7.jar
Download http://repo1.maven.org/maven2/org/ow2/asm/asm/4.0/asm-4.0.jar
Download http://repo1.maven.org/maven2/org/ow2/asm/asm-tree/4.0/asm-tree-4.0.jar
Download http://repo1.maven.org/maven2/org/ow2/asm/asm-commons/4.0/asm-commons-4.0.jar
Download http://repo1.maven.org/maven2/org/ow2/asm/asm-util/4.0/asm-util-4.0.jar
Download http://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/4.0/asm-analysis-4.0.jar
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:compileTestGroovy UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build

BUILD SUCCESSFUL

Total time: 26.028 secs

…おかげで、なんか予定外に依存関係の管理を使うことになってしまいました。あと、Javaソースコードはないですけど、compileJava入ってますね。

ダウンロードしたファイルや各種キャッシュは、$HOME/.gradleに保存されるようですね。

$ ll ~/.gradle
合計 16
drwxrwxr-x  4 xxxxx xxxxx 4096 Aug  5 20:42 ./
drwxr-xr-x 62 xxxxx xxxxx 4096 Aug  5 20:36 ../
drwxrwxr-x  4 xxxxx xxxxx 4096 Aug  5 20:42 caches/
drwxrwxr-x  2 xxxxx xxxxx 4096 Aug  5 20:24 jna/

実行してみよう

前回のエントリから、Mainクラスの実行にはapplicationプラグインが必要なことはわかっているので、build.gradleを以下のように修正。

apply plugin: 'groovy'
apply plugin: 'application'

mainClassName = 'HelloGradle'

repositories {
    mavenCentral()
}

dependencies {
    groovy group: 'org.codehaus.groovy', name: 'groovy', version: '2.0.1'
}

実行。

$ gradle run
:compileJava UP-TO-DATE
:compileGroovy
:processResources UP-TO-DATE
:classes
:run
Hello World
Groovy Version = 2.0.1

BUILD SUCCESSFUL

Total time: 12.831 secs

動きました〜。

ちなみに、Groovyではスクリプトで書いた場合、ファイル名がクラス名になる…とうことを考えると、以下のコードでも動作します。
src/main/groovy/HelloGradle.groovy

println("Hello World")
println("Groovy Version = ${GroovySystem.version}")

実行。

$ gradle run
:compileJava UP-TO-DATE
:compileGroovy
:processResources UP-TO-DATE
:classes
:run
Hello World
Groovy Version = 2.0.1

BUILD SUCCESSFUL

Total time: 12.232 secs

まあ、ここまで端折るくらいなら、普通にgroovyコマンドで実行すれば?という感じだとは思いますが。