Как скомпилировать смешанный Java-проект Groovy с преобразованиями AST?

Когда я пытаюсь скомпилировать свой проект с помощью компилятора 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 ответа

Попробуйте использовать 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>

Файлы Java должны находиться под groovy каталог с файлами Groovy, если они должны быть скомпилированы.

Если вы не против разбить классы Java и Groovy на разные модули Maven, я настоятельно рекомендую вам сделать это.

Преимущества заключаются в том, что вы никогда не столкнетесь с проблемами совместной компиляции, вы получите четкое представление о том, что зависит от того, что (для использования модуля Groovy из модуля Java вы добавляете в него зависимость Maven), Groovy AST будет виден из классы Java, и вы остаетесь в здравом уме, не смешивая языки в одном модуле.

Я создал простой проект java-groovy-maven-test на GitHub, чтобы показать, как вы можете это сделать.

По сути, вы создаете два модуля, один из которых содержит ваш класс Java (test-java в моем проекте), другой, содержащий класс Groovy (test-groovy).

Оба находятся под одним родительским модулем Maven.

Это работает намного лучше, чем пытаться скомпилировать оба Groovy/Java в одном модуле.

Инструкция о том, как построить и протестировать проект, находится на странице README.

Вы можете просто захотеть использовать def Ключевое слово вместо F.FBuilder, При использовании совместной компиляции (java и groovy, смешанные в одной исходной папке), файлы groovy отображаются в Java-модель Eclipse/JDT. Однако это отображение происходит до того, как было применено много преобразований AST, поэтому дополнительные типы и методы, такие как @Builder добавления не видны Java.

Другие вопросы по тегам