春天的靴子 魂狩篇第一话

| 分类 MICROSERVICE  | 标签 spring  springboot  java  groovy  gradle 

在使用 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>

上一篇     下一篇