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

如果启用了联合编译,则要传递给 javac 的属性

groovyc -j -Jtarget=1.6 -Jsource=1.6 A.groovy B.java

-Fflag

如果启用了联合编译,则要传递给 javac 的标志

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 编译器。

3. Gant

Gant 是一种使用 Groovy 而不是 XML 来指定逻辑的 Ant 任务脚本工具。因此,它具有与 Groovyc Ant 任务完全相同的特性。

4. Gradle

Gradle 是一种构建工具,它允许您利用 Ant 的灵活性,同时保留诸如 Maven 之类工具的约定优于配置的简单性。构建使用 Groovy DSL 指定,Groovy DSL 提供了极大的灵活性和简洁性。

5. Maven 集成

在 Maven 项目中编译 Groovy 代码有多种方法。 GMavenPlus 是最灵活、功能最丰富的工具,但与大多数 Groovy 编译器工具一样,它可能难以处理联合 Java-Groovy 项目(原因与 GMavenGradle 可能会遇到问题的原因相同)。 用于 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 版本的支持)。它的联合编译使用存根(这意味着它具有与 GMavenGradle 相同的潜在问题)。与前代产品相比,它的主要优势是它支持最新版本的 Groovy、InvokeDynamic、Android 上的 Groovy、GroovyDoc 和配置脚本。

5.1.3. GMaven 2

与名称可能暗示的不同,GMaven 2 并非旨在取代 GMaven。事实上,它删除了 GMaven 插件的非脚本化功能。它尚未发布任何版本,并且目前似乎处于非活动状态。

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-jsontransitive=false 参数将允许 Gradle 下载 JSON 支持 jar 文件,而不会向 Groovy 的正常 jar 文件添加依赖项。

请确保访问 插件主页 以找到最新的文档和版本。