IntelliJ构建混合Groovy和Java项目失败,找不到符号

时间:2017-04-26 09:42:49

标签: java intellij-idea groovy

我有一个混合(Java& Groovy)IntelliJ项目。我的Groovy类正在使用@Builder注释。我可以从Java访问构建器,但是在项目的构建过程中失败了......

Error:(27, 105) java: cannot find symbol
symbol:   method builder()
location: class foo.bar.Sample

如果我注释掉构建器的使用,那么项目构建完全正常,我可以在生成的类文件中看到构建器。

我认为问题是构建顺序,javac尝试在编译Groovy代码之前编译我的Java代码。

知道如何解决这个问题吗?

IntelliJ版本是Community 2017.1.2

*更新*

我试着对我的项目更加冗长......它的设置就像这样......

源根源是:

Project source roots

DataObject groovy类:

import groovy.transform.builder.Builder

@Builder
class DataObject {
    String message 
}

和MainClass ......

public class MainClass {

    public static void main(String... args) throws Exception {
        System.out.println(DataObject.builder().message("HelloWorld!").build().getMessage());

        DataObject dataObject = new DataObject();
        dataObject.setMessage("HelloWorld!");
        System.out.println(dataObject.getMessage());
    }
}

Groovy-Eclipse在字节码版本1.8中被设置为Java编译器(groovy-eclipse-batch-2.4.3-01.jar)

如果我尝试编译项目,我收到以下错误... Build error

如果我使用javac作为Java编译器进行尝试,我会收到类似的错误(java:找不到构建器的symbel)。

如果我从Java类中删除了构建器的使用,那么项目构建完美,并且我能够使用构建器,至少我对groovy类没有任何更改。

1 个答案:

答案 0 :(得分:2)

您受https://issues.apache.org/jira/browse/GROOVY-3683影响。

假设您已使用sdkman安装了Groovy。

$ sdk use groovy 2.4.9
Using groovy version 2.4.9 in this shell.

# This is the error you get using joint compilation
$ groovyc -j src/main/groovy/* 
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Compile error during compilation with javac.
/Users/danyjb/Downloads/GroovyTest/src/main/groovy/MainClass.java:4: error: cannot find symbol
        System.out.println(DataObject.builder().message("HelloWorld!").build().getMessage());
                                     ^
  symbol:   method builder()
  location: class DataObject
1 error

要解决此问题,您需要单独编译Groovy和Java:

$ groovyc src/main/groovy/DataObject.groovy -d out/
$ javac -cp $GROOVY_HOME/lib/groovy-2.4.9.jar:out/ -d out/ src/main/groovy/MainClass.java

就IntelliJ IDEA而言,这意味着您需要将Groovy代码放在单独的模块中,并将Java模块中的依赖项添加到Groovy模块。