在使用 spring-boot 时,混用 java 和 groovy 代码,会遇到编译的顺序问题。
In Gradle
groovy plugin 编译代码的任务 (compileGroovy task) 依赖于 java plugin 编译代码的任务 (compileJava task)。
如果你在 java 中引用了 groovy 的代码,java 文件编译时,groovy 文件还没编译,必然报 ClassNotFound 类似的异常。
再来说一下 gradle 的 java,和 groovy 这两个插件,java plugin 会在 src/main/java 下寻找 java 源文件。groovy plugin 会在 src/main/groovy 下寻找 groovy 和java源文件。
对于把 java 和 groovy 源文件都放在 src/main/java 这种情况,直接使用 compileGroovy task 来完成编译工作。
sourceSets.main.groovy.srcDirs = ['src/main/groovy', 'src/main/java']
sourceSets.main.java.srcDirs = [] // don't compile Java code twice
In Maven
用 maven 编译时,问题和上面差不多。groovy 提供的 maven 插件是:GMavenPlus,也会默认到 src/main/groovy 下寻找 groovy 代码,需要加上这个配置:
<build>
<!-- groovy maven plugin -->
<plugins>
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.5</version>
<configuration>
<sources>
<source>
<directory>${project.basedir}/src/main/java</directory>
<includes>
<include>**/*.groovy</include>
</includes>
</source>
</sources>
<testSources>
<testSource>
<directory>${project.basedir}/src/test/java</directory>
<includes>
<include>**/*.groovy</include>
</includes>
</testSource>
</testSources>
</configuration>
<executions>
<execution>
<goals>
<goal>addSources</goal>
<goal>addTestSources</goal>
<goal>generateStubs</goal>
<goal>compile</goal>
<goal>testGenerateStubs</goal>
<goal>testCompile</goal>
<goal>removeStubs</goal>
<goal>removeTestStubs</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>