【解決しました】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(Pleiades、Doma 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]を実行
4. エンティティなどが自動生成されるが、XxxListener.javaでコンパイルエラーが出る。具体的には、メソッドのオーバーライドに失敗している。
5. doma-2.0.1.jarは依存性に追加されている。importやimplementsの部分にはコンパイルエラーは出ていない。
6. ワークスペースを見ると、クラスファイル(XxxListener.class)は生成されている。(これはGradleが自動生成時に作ったものか?)
7. コマンドプロンプトから「javap DeptListener.class」すると、メソッドもきちんと作成されている様子。
8. Eclipse上でDeptListener.javaを開き、全メソッドをコメントアウトし、[ソース]-[メソッドのオーバーライド/実装]でやろうとすると、下記のようなエラーが出て、オーバーライド出来ない。
9. もちろん、手書きでコードを書いてもダメ。
何回も[プロジェクト]-[クリーン]しても、状況は変わりませんでした。
また、Eclipseのバージョンを変えて、Eclipse 4.4.0 SDKでやってもダメでした。
謎だ・・・。
★追記:解決策
Doma作者の@nakamura_toさんにTwitterで教えていただきました。
EclipseのJavaコンパイラレベルの問題でした。
デフォルトが[1.5]になっていたので、[1.8]にしたらコンパイルエラーが一気に解決しました!
[Project]-[Properties]から、下記のように変更します。
1.5までは、インターフェイスのメソッドに対して@Overrideアノテーションが付けられないので、コンパイルエラーが出てたんですね。
(1.6以降なら可能)
@nakamura_toさん、ありがとうございました!
★再追記(2014/11/20)
Eclipse側の設定でコンパイラレベルが1.8になっていても、デフォルトではGradleプロジェクトのコンパイラレベルが1.5になるようです。
また、上記の8.の現象については、また別の問題で、どうやらEclipseのバグのようです。
型引数を持つインターフェイスの中の、デフォルトメソッドに対して、Eclipseのオーバーライド機能を使うことができないというところまで確認できました。
もちろん手書きでオーバーライドすることは可能です。