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.
要使用 Groovy 的插件,请在构建脚本中包含以下内容:
To use the Groovy plugin, include in your build script:
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. |
compile |
compile |
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 |
sourceSet Classes |
compileSourceSet Groovy |
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/ |
给定源集的 Java 源代码 Java source for the given source set |
src/ |
给定源集的资源 Resources for the given source set |
src/ |
给定源集的 Groovy 源代码。也可能包含联合编译的 Java 源代码。 Groovy sources for the given source set. May also contain Java sources for joint compilation. |
和 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'] } } }
由于 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') } } }
GroovyCompile
和 GroovyDoc
任务以两种方式使用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
中。 groovy-all(-indy)
Jar is found on classpath
, the same Jar will be added to groovyClasspath
.classpath
中找到 groovy(-indy)
Jar ,并且该项目已经至少有一个仓库声明,那么相应的 groovy(-indy)
仓库依赖将添加到 groovyClasspath
中。 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
。 groovyClasspath
could not be inferred.
Groovy 插件不会向项目添加任何的约定属性。
The Groovy plugin does not add any convention properties to the project.
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”. |
[ |
该源目录包含此源集的 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. |
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 |
|
source |
FileTree 。可以使用《第 16.5 节,“指定一组输入文件”》中所讲到的任何一种方法来设置。FileTree . Can set using anything described in Section 16.5, “Specifying a set of input files”. |
|
destinationDir |
File . |
|
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).