第24章 Groovyプラグイン

The Groovy plugin extends the Java plugin to add support for Groovy projects. It can deal with Groovy code, mixed Groovy and Java code, and even pure Java code (although we don't necessarily recommend to use it for the latter). The plugin supports joint compilation, which allows you to freely mix and match Groovy and Java code, with dependencies in both directions. For example, a Groovy class can extend a Java class that in turn extends a Groovy class. This makes it possible to use the best language for the job, and to rewrite any class in the other language if needed.

Groovyプラグインは、Javaプラグインを拡張し、Groovyプロジェクトのサポートを追加したものです。 GroovyコードとGroovy/Javaの混合コードをサポートするほか、Javaコードのみのプロジェクトを取り扱うこともできます(Javaコードだけのプロジェクトにこのプラグインを使うことはあまり推奨しませんが)。 また、JavaとGroovyのジョイントコンパイルをサポートしており、GroovyコードとJavaコードを自由に混ぜ合わせたり、お互いに統合させることができます。 例えば、GroovyのクラスはJavaのクラスを継承できますし、更にそのJavaクラスがGroovyクラスを継承していても問題ありません。時々に応じて最適な言語を選択でき、必要なときにはいつでもクラスを別言語で書き直すことができます。

24.1. 使用方法Usage

To use the Groovy plugin, include the following in your build script:

Groovyプラグインを使うためには、ビルドスクリプトに下記を含めます:

例24.1 Groovyプラグインの使用

build.gradle

apply plugin: 'groovy'

24.2. タスクTasks

The Groovy plugin adds the following tasks to the project.

Groovyプラグインは、以下のタスクをプロジェクトに追加します。

表24.1 Groovyプラグイン - タスクGroovy plugin - tasks

タスク名Task name 依存先Depends on Type 説明Description
compileGroovy compileJava GroovyCompile 製品のGroovyソースファイルをコンパイルするCompiles production Groovy source files.
compileTestGroovy compileTestJava GroovyCompile テストのGroovyソースファイルをコンパイルするCompiles test Groovy source files.
compileSourceSetGroovy compileSourceSetJava GroovyCompile 特定のソースセットのGroovyソースファイルをコンパイルするCompiles the given source set's Groovy source files.
groovydoc - Groovydoc 製品のGroovyソースファイルのAPIドキュメントを生成するGenerates API documentation for the production Groovy source files.

The Groovy plugin adds the following dependencies to tasks added by the Java plugin.

Groovyプラグインは、Javaプラグインによって追加されたタスクに以下の依存関係を追加します。

表24.2 Groovyプラグイン - タスクの追加依存関係Groovy plugin - additional task dependencies

タスク名Task name依存先Depends on
classes compileGroovy
testClasses compileTestGroovy
sourceSetClasses compileSourceSetGroovy

図24.1 Groovyプラグイン - タスクGroovy plugin - tasks

Groovyプラグイン - タスクGroovy plugin - tasks

24.3. プロジェクトレイアウトProject layout

The Groovy plugin assumes the project layout shown in 表24.3「Groovyプラグイン - プロジェクトレイアウトGroovy plugin - project layout. All the Groovy source directories can contain Groovy and Java code. The Java source directories may only contain Java source code. [18] None of these directories need to exist or have anything in them; the Groovy plugin will simply compile whatever it finds.

Groovyプラグインでは、表24.3「Groovyプラグイン - プロジェクトレイアウトGroovy plugin - project layoutに示したようなプロジェクトレイアウトを想定しています。すべてのGroovyソースディレクトリは、GroovyおよびJavaコードを含むことができます。Javaソースディレクトリは、Javaソースコードだけしか含むことができません。 [19] これらのどのディレクトリも、存在しなかったり、何も含んでいなくてもかまいません。Groovyプラグインは、単純に見つけたディレクトリをコンパイルするだけです。

表24.3 Groovyプラグイン - プロジェクトレイアウトGroovy plugin - project layout

ディレクトリDirectory 意味Meaning
src/main/java 製品のJavaソースProduction Java source
src/main/resources 製品のリソースProduction resources
src/main/groovy 製品のGroovyソース。ジョイントコンパイルするJavaソースを含んでもよいProduction Groovy sources. May also contain Java sources for joint compilation.
src/test/java テストのJavaソースTest Java source
src/test/resources テストのリソースTest resources
src/test/groovy テストのGroovyソース。ジョイントコンパイルするJavaソースを含んでもよいTest Groovy sources. May also contain Java sources for joint compilation.
src/sourceSet/java 特定のソースセットのJavaソースJava source for the given source set
src/sourceSet/resources 特定のソースセットのリソースResources for the given source set
src/sourceSet/groovy 特定のソースセットのGroovyソース。ジョイントコンパイルするJavaソースを含んでもよいGroovy sources for the given source set. May also contain Java sources for joint compilation.

24.3.1. プロジェクトレイアウトの変更Changing the project layout

Just like the Java plugin, the Groovy plugin allows you to configure custom locations for Groovy production and test sources.

Javaプラグインと同じように、Groovyプラグインも製品コードやテストコードの場所を変更することができます。

例24.2 Groovyソースレイアウトのカスタマイズ

build.gradle

sourceSets {
    main {
        groovy {
            srcDirs = ['src/groovy']
        }
    }

    test {
        groovy {
            srcDirs = ['test/groovy']
        }
    }
}

24.4. 依存関係の管理 Dependency management

Because Gradle's build language is based on Groovy, and parts of Gradle are implemented in Groovy, Gradle already ships with a Groovy library (2.3.3 as of Gradle 2.0). Nevertheless, Groovy projects need to explicitly declare a Groovy dependency. This dependency will then be used on compile and runtime class paths. It will also be used to get hold of the Groovy compiler and Groovydoc tool, respectively.

Gradleのビルド言語はGroovyをベースにしており、Gradleの一部もGroovyで実装されているので、Gradleには既にGroovyライブラリ(Gradle2.0からは2.3.3)が同梱されています。ですが、Groovyプロジェクトでは明示的にGroovyへの依存関係を宣言しなければなりません。 ここで宣言したGroovyへの依存関係は、コンパイルクラスパスおよび実行時クラスパスに追加されます。さらに、GroovyコンパイラおよびGroovydocツールを取得するのにも使用されます。

If Groovy is used for production code, the Groovy dependency should be added to the compile configuration:

Groovyが製品コードで使われている場合は、Groovy依存関係はcompileコンフィギュレーションに追加してください。

例24.3 Groovyプラグインの設定

build.gradle

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.6'
}

If Groovy is only used for test code, the Groovy dependency should be added to the testCompile configuration:

Groovyがテストコードのみで使われている場合は、Groovy依存関係はtestCompileコンフィギュレーションに追加してください。

例24.4 Groovyテスト用の依存関係設定

build.gradle

dependencies {
    testCompile "org.codehaus.groovy:groovy:2.3.6"
}

To use the Groovy library that ships with Gradle, declare a localGroovy() dependency. Note that different Gradle versions ship with different Groovy versions; as such, using localGroovy() is less safe then declaring a regular Groovy dependency.

Gradleに同梱されているGroovyを使うには、localGroovy()を依存関係で宣言してください。ただ注意してほしいのは、Gradleのバージョンが異なれば同梱されているGroovyのバージョンも異なる可能性があるということです。localGroovy()は、普通の宣言方法に比べると安全とは言えません。

例24.5 同梱のGroovyを使用する依存関係設定

build.gradle

dependencies {
    compile localGroovy()
}

The Groovy library doesn't necessarily have to come from a remote repository. It could also come from a local lib directory, perhaps checked in to source control:

Groovyライブラリは、必ずしもリモートのリポジトリから取得しなければならないわけではありません。ローカルのlibディレクトリなどに格納して、ソースコード管理システムにチェックインしたりすることもできます。

例24.6 Groovyをファイル依存関係で設定する

build.gradle

repositories {
    flatDir { dirs 'lib' }
}

dependencies {
    compile module('org.codehaus.groovy:groovy:1.6.0') {
        dependency('asm:asm-all:2.2.3')
        dependency('antlr:antlr:2.7.7')
        dependency('commons-cli:commons-cli:1.2')
        module('org.apache.ant:ant:1.9.3') {
            dependencies('org.apache.ant:ant-junit:1.9.3@jar',
                         'org.apache.ant:ant-launcher:1.9.3')
        }
    }
}

The “module” reference may be new to you. See 51章依存関係の管理 for more information about this and other information about dependency management.

24.5. Groovyクラスパスの自動設定 Automatic configuration of groovyClasspath

GroovyCompile and Groovydoc tasks consume Groovy code in two ways: on their classpath, and on their groovyClasspath. The former is used to locate classes referenced by the source code, and will typically contain the Groovy library along with other libraries. The latter is used to load and execute the Groovy compiler and Groovydoc tool, respectively, and should only contain the Groovy library and its dependencies.

GroovyCompileタスクとGroovydocタスクは二つの用途でGroovyを使用します。タスクのclasspathgroovyClasspathです。前者はソースコードから参照されているクラスを配置するパスで、Groovyライブラリも典型的には他のライブラリと一緒に格納されます。後者はGroovyコンパイラとGroovydocツールをロードして実行するために使用されるパスで、Groovyライブラリとその依存関係のみが配置されていなければなりません。

Unless a task's groovyClasspath is configured explicitly, the Groovy (base) plugin will try to infer it from the task's classpath. This is done as follows: groovyClasspathが明示的に設定されていない場合、Groovy(base)プラグインはタスクのclasspathから以下のように設定値を推論しようとします。

  • If a groovy-all(-indy) Jar is found on classpath, that jar will be added to groovyClasspath.groovy-all(-indy)のJarがclasspathに見つかれば、そのjarをgroovyClasspathにも追加します。
  • If a groovy(-indy) jar is found on classpath, and the project has at least one repository declared, a corresponding groovy(-indy) repository dependency will be added to groovyClasspath.groovy(-indy)のJarがclasspathに見つかれば、そして少なくとも一つのリポジトリがプロジェクトに設定されていれば、リポジトリから対応するgroovy(-indy)の依存関係を取得してgroovyClasspathに追加します。
  • Otherwise, execution of the task will fail with a message saying that groovyClasspath could not be inferred. それ以外の場合は、groovyClasspathの推論に失敗した旨のメッセージを出力してタスクは失敗します。

Note that the “-indy” variation of each jar refers to the version with invokedynamic support.

24.6. 規約プロパティConvention properties

The Groovy plugin does not add any convention properties to the project.

Groovyプラグインは、プロジェクトには規約プロパティを追加しません。

24.7. ソースセットプロパティSource set properties

The Groovy plugin adds the following convention properties to each source set in the project. You can use these properties in your build script as though they were properties of the source set object (see 「規約 Conventions).

Groovyプラグインは、プロジェクトの各ソースセットに以下の規約プロパティを追加します。これらのプロパティは、あたかもソースセットオブジェクトのプロパティであるかのようにビルドスクリプト内で使うことができます(「規約 Conventions参照)。

表24.4 Groovyプラグイン - ソースセットプロパティGroovy plugin - source set properties

プロパティ名Property name Type デフォルト値Default value 説明Description
groovy SourceDirectorySet (読取り専用) SourceDirectorySet (read-only) 非null Not null このソースセットのGroovyソースファイル。Groovyソースディレクトリにある、すべての.groovy.javaファイルを含み、その他のタイプのファイルは含まない The Groovy source files of this source set. Contains all .groovy and .java files found in the Groovy source directories, and excludes all other types of files.
groovy.srcDirs Set<File>「入力ファイルセットを指定する Specifying a set of input filesで説明されたものなら何でも設定可能 Set<File>. Can set using anything described in 「入力ファイルセットを指定する Specifying a set of input files. [projectDir/src/name/groovy] このソースセットのGroovyソースファイルを含むソースディレクトリ。ジョイントコンパイルするJavaソースファイルも含む場合がある The source directories containing the Groovy source files of this source set. May also contain Java source files for joint compilation.
allGroovy FileTree (読取り専用) FileTree (read-only) 非null Not null このソースセットの全Groovyソースファイル。Groovyソースディレクトリにある.groovyファイルのみを含む All Groovy source files of this source set. Contains only the .groovy files found in the Groovy source directories.

These properties are provided by a convention object of type GroovySourceSet.

上記プロパティはGroovySourceSet型の規約オブジェクトにより提供されます。

The Groovy plugin also modifies some source set properties:

また、Groovyプラグインは、いくつかのソースセットプロパティを修正します:

表24.5 Groovyプラグイン - ソースセットプロパティGroovy plugin - source set properties

プロパティ名Property name 変更点Change
allJava Groovyソースディレクトリにあるすべての.javaファイルを追加Adds all .java files found in the Groovy source directories.
allSource Groovyソースディレクトリにあるすべてのソースファイルを追加Adds all source files found in the Groovy source directories.

24.8. GroovyCompile

The Groovy plugin adds a GroovyCompile task for each source set in the project. The task type extends the JavaCompile task (see 「CompileJavaCompileJava). The GroovyCompile task supports most configuration options of the official Groovy compiler.

Groovyプラグインは、プロジェクトの各ソースセットにGroovyCompileタスクを追加します。このタスクはJavaCompileタスクを拡張したものです(「CompileJavaCompileJava参照)。groovyOptions.useAntがtrueになっていなければ、GradleネイティブのGroovyコンパイラ統合が使用されます。Antベースのコンパイラを使うこともできますが、ほとんどのプロジェクトではネイティブのGroovyコンパイラを使ったほうがいいでしょう。 このGroovyCompileタスクは、公式Groovyコンパイラのオプションをほとんど全てサポートしています。

表24.6 Groovyプラグイン - GroovyCompileプロパティGroovy plugin - GroovyCompile properties

タスクプロパティTask Property Type デフォルト値Default Value
classpath FileCollection sourceSet.compileClasspath
source FileTree「入力ファイルセットを指定する Specifying a set of input filesで説明されたものなら何でも設定可能FileTree. Can set using anything described in 「入力ファイルセットを指定する Specifying a set of input files. sourceSet.groovy
destinationDir File. sourceSet.output.classesDir
groovyClasspath FileCollection groovy configuration if non-empty; Groovy library found on classpath otherwise


[18] We are using the same conventions as introduced by Russel Winder's Gant tool (http://gant.codehaus.org).

[19] Russel WinderのGant (http://gant.codehaus.org)が導入したのと同じ規約を使っています。