第二十四章. Groovy 插件

Chapter 24. The Groovy Plugin

Groovy 插件扩展了 Java 插件,以添加对 Groovy 项目的支持。它可以处理 Groovy 代码,以及混合的 Groovy 和 Java 代码,甚至纯 Java 代码(尽管我们不一定建议将其用于后者)。该插件支持联合编译,它允许自由地混合和匹配 Groovy 和 Java 代码以及各自的依赖。例如,一个 Groovy 类可以扩展一个 Java 类,而这个 Java 类也可以扩展自一个 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 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.

24.1. 用法

24.1. Usage

要使用 Groovy 的插件,请在构建脚本中包含以下内容:
To use the Groovy plugin, include in your build script:

示例 24.1. 使用 Groovy 插件 - Example 24.1. Using the Groovy plugin

build.gradle

apply plugin: 'groovy'

24.2. 任务

24.2. Tasks

Groovy 的插件向项目中添加了以下任务。
The Groovy plugin adds the following tasks to the project.

表 24.1. Groovy 插件——任务 - Table 24.1. 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.

Groovy 的插件向 Java 插件所加入的任务添加了以下依赖。
The Groovy plugin adds the following dependencies to tasks added by the Java plugin.

表 24.2. Groovy 插件——额外的任务依赖 - Table 24.2. Groovy plugin - additional task dependencies

任务名称
Task name
依赖于
Depends on
classes compileGroovy
testClasses compileTestGroovy
sourceSetClasses compileSourceSetGroovy

图 24.1. Groovy 插件——任务 - Figure 24.1. Groovy plugin - tasks

Groovy 插件——任务

24.3. 项目布局

24.3. Project layout

Groovy 插件会假定项目的布局如表 24.3,“Groovy 插件——项目布局”所示。所有的 Groovy 源码目录都可以包含 Groovy Java 代码。 Java 源码目录可能只包含 Java 源代码。 [11]这些目录都不需要一定存在或者包含有内容。Groovy 插件只会进行编译,而不管它发现什么。
The Groovy plugin assumes the project layout shown in Table 24.3, “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. [11] None of these directories need to exist or have anything in them; the Groovy plugin will simply compile whatever it finds.

表 24.3. Groovy 插件——项目布局 - Table 24.3. 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. 更改项目布局

24.3.1. Changing the project layout

和 Java 插件一样,Groovy 插件允许把 Groovy 的生产和测试的源文件配置为自定义的位置。
Just like the Java plugin, the Groovy plugin allows to configure custom locations for Groovy production and test sources.

示例 24.2. 自定义 Groovy 的源文件布局 - Example 24.2. Custom Groovy source layout

build.gradle

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

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

24.4. 依赖管理

24.4. Dependency management

由于 Gradle 的构建语言基于 Groovy,并且部分的 Gradle 使用 Groovy 实现,所以 Gradle 已经附带了一个 Groovy 库(自 Gradle 1.6 起所带的 Groovy 库的版本是 1.8.6)。不过,Groovy 项目需要显式地声明一个 Groovy 依赖。这个依赖将被用于编译和运行时类路径。它也将分别用于获取 Groovy 编译器和 Groovydoc 工具。
Because Gradle's build language is based on Groovy, and parts of Gradle are implemented in Groovy, Gradle already ships with a Groovy library (1.8.6 as of Gradle 1.6). 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.

如果 Groovy 用于生产代码,应该将 Groovy 依赖添加到 compile 配置中:
If Groovy is used for production code, the Groovy dependency should be added to the compile configuration:

示例 24.3. Groovy 的依赖配置 - Example 24.3. Configuration of Groovy dependency

build.gradle

repositories {
    mavenCentral()
}

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

如果 Groovy 仅用于测试代码,应该将 Groovy 的依赖添加到 testCompile 配置中:
If Groovy is only used for test code, the Groovy dependency should be added to the testCompile configuration:

示例 24.4. Groovy 的测试依赖配置 - Example 24.4. Configuration of Groovy test dependency

build.gradle

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

如果要使用 Gradle 附带的 Groovy 库,请声明一个 localGroovy() 依赖。请注意,不同的 Gradle 版本所附带的 Groovy 版本不同;因此,声明一个固定的 Groovy 依赖要比使用 localGroovy() 更安全一些。
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.

示例 24.5. 配置捆绑的 Groovy 依赖 - Example 24.5. Configuration of bundled Groovy dependency

build.gradle

dependencies {
    compile localGroovy()
}

Groovy 库不一定得从远程仓库中获取,它也可能获取自检入代码控制的本地 lib 目录:
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:

示例 24.6. Groovy 的文件依赖配置 - Example 24.6. Configuration of Groovy file dependency

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')
        }
    }
}

24.5. groovyClasspath 的自动配置

24.5. Automatic configuration of groovyClasspath

GroovyCompileGroovyDoc 任务以两种方式使用Groovy:在它们的 classpath 以及它们的 groovyClasspath 上。前者用于查找源代码引用的类,并且通常包含 Groovy 库以及其他库。后者用于分别加载和执行 Groovy 编译器和 Groovydoc 工具,并且应该只包含 Groovy库及其依赖。
GroovyCompile and Groovydoc tasks consume Groovy 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.

除非显式地配置了一个任务的 groovyClasspath,否则 Groovy(基础)插件会尝试从任务的 classpath 推断出它,以如下方式进行:
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:

  • 如果在 classpath 中找到 groovy-all(-indy) Jar,相同的 Jar 将添加到 groovyClasspath 中。
    If a groovy-all(-indy) Jar is found on classpath, the same Jar will be added to groovyClasspath.
  • 如果在 classpath 中找到 groovy(-indy) Jar ,并且该项目已经至少有一个仓库声明,那么相应的 groovy(-indy) 仓库依赖将添加到 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.
  • 其他情况下,任务将执行失败,并提示无法推断 groovyClasspath
    Otherwise, execution of the task will fail with a message saying that groovyClasspath could not be inferred.

24.6. 约定属性

24.6. Convention properties

Groovy 插件不会向项目添加任何的约定属性。
The Groovy plugin does not add any convention properties to the project.

24.7. 源集属性

24.7. Source set properties

Groovy 插件向项目中的每个源集添加了以下,约定属性。你可以在构建脚本中把它们当成是源集对象的属性一样去使用(请参阅《第 21.3 节,“公约”)》。
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 Section 21.3, “Conventions”).

表 24.4. Groovy 插件——源集属性 - Table 24.4. 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>。可以使用《第 16.5 节,“指定一组输入文件”》中所讲到的任何一种方法来设置。
Set<File>. Can set using anything described in Section 16.5, “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.

这些属性由一个 GroovySourceSet 类的约定对象提供。
These properties are provided by a convention object of type GroovySourceSet.

Groovy 的插件还修改了一些源集的属性:
The Groovy plugin also modifies some source set properties:

表 24.5. Groovy 插件——源集属性 - Table 24.5. 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

24.8. GroovyCompile

Groovy 插件向项目中的每一个源集添加了一个 GroovyCompile 任务。该任务类型扩展了 JavaCompile 任务(请参阅《第 23.11 节,“CompileJava”》)。该 GroovyCompile 任务支持官方 Groovy 编译器的大多数配置选项。
The Groovy plugin adds a GroovyCompile task for each source set in the project. The task type extends the JavaCompile task (see Section 23.11, “CompileJava”). The GroovyCompile task supports most configuration options of the official Groovy compiler.

表 24.6. Groovy 插件——GroovyCompile 属性 - Table 24.6. Groovy plugin - GroovyCompile properties

任务属性
Task Property
类型
Type
默认值
Default Value
classpath FileCollection sourceSet.compileClasspath
source FileTree。可以使用《第 16.5 节,“指定一组输入文件”》中所讲到的任何一种方法来设置。
FileTree. Can set using anything described in Section 16.5, “Specifying a set of input files”.
sourceSet.groovy
destinationDir File. sourceSet.output.classesDir
groovyClasspath FileCollection 如果 groovy 配置不为空,则为该配置;否则为 classpath 中找到的 Groovy 库
groovy configuration if non-empty; Groovy library found on classpath otherwise


[11] 我们使用和 Russel Winder 的 Gant 工具引入的同样的约定(http://gant.codehaus.org)。
[11] We are using the same conventions as introduced by Russel Winder's Gant tool (http://gant.codehaus.org).