JavaからGroovyのクラスを使用しているコードをGradleでコンパイルする

  • 10
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

問題

↓こんな構成のプロジェクトがあったとして、

|-build.gradle
`-src/main/
   |-java/sample
   |  `-JavaClass.java
   `-groovy/sample
      `-GroovyClass.groovy
JavaClass.java
package sample;

public class JavaClass {

    public static void main(String[] args) {
        new GroovyClass().method();
    }
}
GroovyClass.groovy
package sample

def class GroovyClass {
    def method() {
        println 'GroovyClass.method()'
    }
}

Java と Groovy で、それぞれクラスを定義して、 Java 側の実装が Groovy の実装を参照している、という構成。

これを Gradle でコンパイルするために ↓ のように build.gradle を記述したとする。

build.gradle
apply plugin: 'groovy'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.0'
}

コンパイルすると、 ↓ のようになる。

> gradle classes
:compileJava
F:\tmp\gradle\groovy\src\main\java\sample\JavaClass.java:6: エラー: シンボルを見つけられません
        new GroovyClass().method();
            ^
  シンボル:   クラス GroovyClass
  場所: クラス JavaClass
エラー1個
:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 3.827 secs

Groovy のクラスが見つけられません、とエラーになる。

解決策

ググったら 、 ↓ のようにしないといけないらしい。

build.gradle
apply plugin: 'groovy'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.0'
}

sourceSets.main.java.srcDirs = []
sourceSets.main.groovy.srcDirs += 'src/main/java'

Java 側のソースセットを消して、 Groovy 側に追加する。

> gradle classes
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE

BUILD SUCCESSFUL

Total time: 3.423 secs

コンパイルできた。