読者です 読者をやめる 読者になる 読者になる

Java EE 事始め!

主にJava EEについて、つらつらとマイペースに書いていきます。「Java EEを勉強するときに、一番最初に読んでもらえるブログ」を目指して頑張ります!

【解決しました】Eclipse+GradleでDoma 2のエンティティ自動生成すると、リスナークラスがコンパイルエラー

  • 現象

EclipseのGradleプロジェクトでDoma 2のエンティティを自動生成すると、生成されたXxxListener.javaコンパイルエラーになる
・クラスファイル(XxxListener.class)は生成されている

  • 環境

Windows 7 SP1 64bit
Oracle JDK 8u25
Eclipse IDE for Java Developers 4.4.1(PleiadesDoma Tools、Gradleプラグイン追加済み)
Gradle 2.2(ZIP版)
Doma 2.0.1
Doma-Gen 2.0.1
FreeMarker 2.3.20
PostgreSQL 8.4.17

  • 詳細

1. Eclipse上でGradleプロジェクトを作成(サンプル・プロジェクトは[Java Quickstart])
2. build.gradleを下記のように編集

apply plugin: 'java'
apply plugin: 'eclipse'

configurations {
    domaGenRuntime
}

repositories {
    mavenCentral()
    maven {url 'https://oss.sonatype.org/content/repositories/snapshots/'}
}

dependencies {
    domaGenRuntime 'org.seasar.doma:doma-gen:2.0.1'
    domaGenRuntime 'org.postgresql:postgresql:9.3-1102-jdbc41'
    compile group: 'org.seasar.doma', name: 'doma', version: '2.0.1'
    compile group: 'org.seasar.doma', name: 'doma-gen', version: '2.0.1'
    compile group: 'org.postgresql', name: 'postgresql', version: '9.3-1102-jdbc41'
}

task gen << {
    ant.taskdef(resource: 'domagentask.properties',
        classpath: configurations.domaGenRuntime.asPath)
    ant.gen(url: 'jdbc:postgresql://localhost/postgres', user: 'postgres', password: 'P@ssw0rd') {
        entityConfig()
        daoConfig()
        sqlConfig()
    }
}

3. タスク[gen]を実行
f:id:MasatoshiTada:20141119131501p:plain
4. エンティティなどが自動生成されるが、XxxListener.javaコンパイルエラーが出る。具体的には、メソッドのオーバーライドに失敗している。
f:id:MasatoshiTada:20141119131840p:plain
5. doma-2.0.1.jarは依存性に追加されている。importやimplementsの部分にはコンパイルエラーは出ていない。
6. ワークスペースを見ると、クラスファイル(XxxListener.class)は生成されている。(これはGradleが自動生成時に作ったものか?)
f:id:MasatoshiTada:20141119132352p:plain
7. コマンドプロンプトから「javap DeptListener.class」すると、メソッドもきちんと作成されている様子。
f:id:MasatoshiTada:20141119132539p:plain
8. Eclipse上でDeptListener.javaを開き、全メソッドコメントアウトし、[ソース]-[メソッドのオーバーライド/実装]でやろうとすると、下記のようなエラーが出て、オーバーライド出来ない。
f:id:MasatoshiTada:20141119132912p:plain
9. もちろん、手書きでコードを書いてもダメ。


何回も[プロジェクト]-[クリーン]しても、状況は変わりませんでした。
また、Eclipseのバージョンを変えて、Eclipse 4.4.0 SDKでやってもダメでした。

謎だ・・・。



★追記:解決策
Doma作者の@nakamura_toさんにTwitterで教えていただきました。
EclipseJavaコンパイラレベルの問題でした。
デフォルトが[1.5]になっていたので、[1.8]にしたらコンパイルエラーが一気に解決しました!
[Project]-[Properties]から、下記のように変更します。
f:id:MasatoshiTada:20141119205053p:plain

1.5までは、インターフェイスメソッドに対して@Overrideアノテーションが付けられないので、コンパイルエラーが出てたんですね。
(1.6以降なら可能)

@nakamura_toさん、ありがとうございました!


★再追記(2014/11/20)
Eclipse側の設定でコンパイラレベルが1.8になっていても、デフォルトではGradleプロジェクトのコンパイラレベルが1.5になるようです。

また、上記の8.の現象については、また別の問題で、どうやらEclipseのバグのようです。
型引数を持つインターフェイスの中の、デフォルトメソッドに対して、Eclipseのオーバーライド機能を使うことができないというところまで確認できました。
もちろん手書きでオーバーライドすることは可能です。