groovyc - Groovy 编译器
1. groovyc,Groovy 编译器
groovyc
是 Groovy 编译器的命令行工具。它允许您将 Groovy 源代码编译成字节码。它在 Java 世界中扮演着与 javac
相同的角色。编译 Groovy 脚本或类的最简单方法是运行以下命令
groovyc MyClass.groovy
这将生成一个 MyClass.class
文件(以及根据源代码内容生成的其他 .class 文件)。groovyc
支持许多命令行开关
短版本 | 长版本 | 描述 | 示例 |
---|---|---|---|
-cp |
-classpath, --classpath |
指定编译类路径。必须是第一个参数。 |
groovyc -cp lib/dep.jar MyClass.groovy |
--sourcepath |
查找源文件的目录。不再使用。指定此参数将不起作用。 |
||
--temp |
编译器的临时目录 |
||
--encoding |
源文件的编码 |
groovyc --encoding utf-8 script.groovy |
|
--help |
显示命令行 groovyc 工具的帮助 |
groovyc --help |
|
-d |
指定生成的类文件的存放位置。 |
groovyc -d target Person.groovy |
|
-v |
--version |
显示编译器版本 |
groovyc -v |
-e |
--exception |
在编译错误时显示堆栈跟踪 |
groovyc -e script.groovy |
-j |
--jointCompilation* |
启用联合编译 |
groovyc -j A.groovy B.java |
-b |
--basescript |
脚本的基类名(必须派生自 Script) |
|
--configscript |
高级编译器配置脚本 |
groovyc --configscript config/config.groovy src/Person.groovy |
|
-Jproperty=value |
如果启用联合编译,则传递给 |
groovyc -j -Jtarget=1.6 -Jsource=1.6 A.groovy B.java |
|
-Fflag |
如果启用联合编译,则传递给 |
groovyc -j -Fnowarn A.groovy B.java |
|
-pa |
--parameters |
为方法参数名生成反射元数据。需要 Java 8+。 |
groovyc --parameters Person.groovy |
-pr |
--enable-preview |
启用预览版 Java 功能(仅限 jdk12+)。 |
groovy --enable-preview Person.groovy |
@argfile |
从指定文件读取选项和源文件。 |
groovyc @conf/args |
注意: * 有关联合编译的完整说明,请参阅 联合编译部分。
2. Ant 任务
请参阅 groovyc Ant 任务 文档。它允许从 Apache Ant 调用 Groovy 编译器。
5. Maven 集成
在 Maven 项目中编译 Groovy 代码有几种方法。GMavenPlus 是最灵活、功能最丰富的,但像大多数 Groovy 编译器工具一样,它在 Java-Groovy 联合项目中可能会遇到困难(原因与 GMaven 和 Gradle 可能存在问题的原因相同)。Groovy-Eclipse Maven 编译器插件 规避了联合编译问题。阅读 此处 可深入讨论这两种方法的优缺点。
第三种方法是使用 Maven 的 Ant 插件来编译 Groovy 项目。请注意,在下面的示例中,Ant 插件绑定到构建的 compile 和 test-compile 阶段。它将在这些阶段被调用,并且其中包含的任务将被执行,这将对源和测试目录运行 Groovy 编译器。生成的 Java 类将与从 Java 源编译的任何标准 Java 类共存并被视为相同,并且对 JRE 或 JUnit 运行时没有区别。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycomp.MyGroovy</groupId>
<artifactId>MyGroovy</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Example building a Groovy project</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.5.0</version>
<type>pom</type> <!-- required JUST since Groovy 2.5.0 -->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<configuration>
<tasks>
<mkdir dir="${basedir}/src/main/groovy"/>
<taskdef name="groovyc"
classname="org.codehaus.groovy.ant.Groovyc">
<classpath refid="maven.compile.classpath"/>
</taskdef>
<mkdir dir="${project.build.outputDirectory}"/>
<groovyc destdir="${project.build.outputDirectory}"
srcdir="${basedir}/src/main/groovy/" listfiles="true">
<classpath refid="maven.compile.classpath"/>
</groovyc>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<configuration>
<tasks>
<mkdir dir="${basedir}/src/test/groovy"/>
<taskdef name="groovyc"
classname="org.codehaus.groovy.ant.Groovyc">
<classpath refid="maven.test.classpath"/>
</taskdef>
<mkdir dir="${project.build.testOutputDirectory}"/>
<groovyc destdir="${project.build.testOutputDirectory}"
srcdir="${basedir}/src/test/groovy/" listfiles="true">
<classpath refid="maven.test.classpath"/>
</groovyc>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
这假设您有一个 Maven 项目设置,其中 groovy
子文件夹与 Java src 和 test 子文件夹同级。您可以使用 java
/jar
原型进行设置,然后将 Java 文件夹重命名为 groovy,或者保留 Java 文件夹并创建 groovy 同级文件夹。此外,还存在一个 groovy 插件,但尚未经过测试或在生产中使用。在如上例所示定义构建部分后,您可以正常调用典型的 Maven 构建阶段。例如,mvn test
将执行测试阶段,编译 Groovy 源和 Groovy 测试源,最后执行单元测试。如果您运行 mvn jar
,它将在所有单元测试通过后执行 jar 阶段,将所有已编译的生产类打包到 jar 中。有关 Maven 构建阶段的更多详细信息,请查阅 Maven2 文档。
5.1. GMaven 和 GMavenPlus
5.1.1. GMaven
GMaven 是原始的 Groovy Maven 插件,支持编译和脚本化 Groovy。
重要
您应该知道 GMaven 不再受支持,并且在 联合编译 方面可能会遇到困难。GMavenPlus 可以是一个很好的替代品,但如果您在联合编译方面遇到问题,您可以考虑 Groovy Eclipse Maven 插件。
5.1.2. GMavenPlus
GMavenPlus 是 GMaven 的重写,正在积极开发中。它支持 GMaven 的大部分功能(少数值得注意的例外是 mojo Javadoc 标签 和对旧 Groovy 版本的支持)。它的联合编译使用存根(这意味着它与 GMaven 和 Gradle 具有相同的潜在问题)。相对于其前身,主要优点是它支持最新的 Groovy 版本、InvokeDynamic、Android 上的 Groovy、GroovyDoc 和配置脚本。
5.2. Groovy Eclipse Maven 插件
Groovy-Eclipse 为 Maven 提供了一个编译器插件。使用该编译器插件,可以使用 Groovy-Eclipse 编译器编译您的 Maven 项目。其中一个在其他地方不可用的功能是无存根联合编译。
6. 联合编译
联合编译意味着 Groovy 编译器将解析 Groovy 源文件,为所有这些文件创建存根,调用 Java 编译器编译存根以及 Java 源,然后以正常的 Groovy 编译器方式继续编译。这允许 Java 和 Groovy 文件无限制地混合。
联合编译可以使用命令行编译器的 -j
标志启用,或者使用嵌套标签以及 Ant 任务所需的所有属性和进一步嵌套的标签启用。
重要的是要知道,如果您不启用联合编译并尝试使用 Groovy 编译器编译 Java 源文件,Java 源文件将被编译,就好像它们是 Groovy 源一样。在某些情况下,这可能有效,因为大多数 Java 语法与 Groovy 兼容,但在许多地方语义可能不同。
7. Android 支持
可以在 Groovy 中编写 Android 应用程序。然而,这需要特殊版本的编译器,这意味着您不能使用常规的 groovyc 工具 来针对 Android 字节码。特别是,Groovy 为 Android 提供了带有 grooid
分类器的特定 JAR 文件。为了使事情更容易,一个 Gradle 插件 为 Android Gradle 工具链添加了 Groovy 语言支持。
插件可以这样应用
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'org.codehaus.groovy:groovy-android-gradle-plugin:1.0.0'
}
}
apply plugin: 'groovyx.android'
然后您需要添加对 Groovy 编译器的 grooid
版本的依赖
dependencies {
compile 'org.codehaus.groovy:groovy:2.4.7:grooid'
}
请注意,如果 Groovy jar 没有提供 grooid
分类器替代方案,则意味着该 jar 直接与 Android 兼容。在这种情况下,您可以直接添加依赖,如下所示
dependencies {
compile 'org.codehaus.groovy:groovy:2.4.7:grooid' // requires the grooid classifier
compile ('org.codehaus.groovy:groovy-json:2.4.7') { // no grooid version available
transitive = false // so do not depend on non-grooid version
}
}
请注意,groovy-json
的 transitive=false
参数将让 Gradle 下载 JSON 支持 jar,而无需添加对 Groovy 正常 jar 的依赖。
请务必访问 插件主页 以查找最新的文档和版本。