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 可能会遇到问题的原因相同)。 用于 Maven 的 Groovy-Eclipse 编译器插件 避开了联合编译问题。阅读 这篇文章,深入了解两种方法的优缺点。
第三种方法是使用 Maven 的 Ant 插件来编译 Groovy 项目。请注意,在下面的示例中,Ant 插件绑定到构建的 compile 和 test-compile 阶段。它将在这些阶段被调用,并且包含的任务将被执行,这些任务将在源目录和测试目录上运行 Groovy 编译器。生成的 Java 类将与从 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 插件,但它尚未在生产中进行测试或使用。在定义完上面的示例中的 build 部分之后,您可以像往常一样调用典型的 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 提供了特定的 JAR 文件,这些 JAR 文件的分类器为 grooid
。为了简化操作, 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'
然后,您需要添加对 grooid
版本的 Groovy 编译器的依赖项
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 文件添加依赖项。
请确保访问 插件主页 以找到最新的文档和版本。