3

当我尝试使用具有以下类的 groovy-eclipse 编译器编译我的项目时:

 import groovy.transform.builder.Builder

// @author: m on 10.05.16 22:15.
@Builder
class F {

   int a

}

public class B {

   int a;

public static void main(String[] args) {
    F.FBuilder builder = F.builder();

    F build = builder.a(1).build();
  }
}

出现以下错误:

[INFO] Using Groovy-Eclipse compiler to compile both Java and Groovy files
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /Users/m/git_repo/mix/src/main/java/B.java:[7,1] 1. ERROR in /Users/m/git_repo/mix/src/main/java/B.java (at line 7)
    F.FBuilder builder = F.builder();
    ^^^^^^^^^^
F.FBuilder cannot be resolved to a type

[ERROR] /Users/m/git_repo/mix/src/main/java/B.java:[7,24] 2. ERROR in /Users/m/git_repo/mix/src/main/java/B.java (at line 7)
    F.FBuilder builder = F.builder();
                           ^^^^^^^
The method builder() is undefined for the type F
[ERROR] Found 2 errors and 0 warnings.

如何解决?请帮忙

4

4 回答 4

0

如果您不介意将 Java 和 Groovy 类拆分为不同的 Maven 模块,我强烈建议您这样做。

好处是您永远不会遇到联合编译问题,您将清楚地了解什么依赖于什么(从 Java 模块中使用 Groovy 模块,您需要添加一个 Maven 依赖项),Groovy AST 将从Java 类,并且通过不在同一个模块中混合语言来保持理智。

我在 GitHub 上创建了一个简单的java-groovy-maven-test项目来展示如何做到这一点。

基本上,您创建了两个模块,一个只包含您的 Java 类(test-java在我的项目中),另一个包含 Groovy 类(test-groovy)。

两者都在同一个父 Maven 模块下。

这比尝试在同一个模块中同时编译 Groovy/Java 效果要好得多。

有关如何构建和测试项目的说明在 README 页面上。

于 2016-05-13T06:52:54.653 回答
0

您可能只想使用def关键字代替F.FBuilder. 使用联合编译时(java和groovy混合在同一个源文件夹中),groovy文件映射到Eclipse/JDT的Java模型中。然而,这种映射发生在应用许多 AST 转换之前,因此@BuilderJava 看不到附加类型和方法(如添加)。

于 2017-07-31T19:10:52.570 回答
0

groovy如果需要交叉编译,Java 文件需要在 Groovy 文件所在的目录下。

于 2016-05-11T19:48:33.693 回答
0

尝试使用maven-antrun-plugin

<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>
于 2016-05-11T20:55:54.593 回答