自作の注釈処理を作って Eclipse で動かせるようにしようとしたらいろいろ詰まったのでメモ。
環境
Java
openjdk 10.0.2
Eclipse
Photon (4.8.0)
※Pleiades All in One
OS
Windows 10
前提
注釈処理自体の話や Eclipse で動かす方法についての説明は Pluggable Annotation Processing API 使い方メモ - Qiita を参照。
ロードに失敗する
症状
注釈処理を設定した方のプロジェクトで「注釈プロセッサー・ファクトリー ... をロードできませんでした」というエラーがでる。
詳細な情報がないため、何が起こっているのかわからず途方にくれた。
原因
- Eclipse を動かしている JVM のバージョンが注釈処理を書いたコードよりも古い
- いろいろ試しているなかで、古いバージョンの Eclipse でも注釈処理が動かない状態になった
- その Eclipse では詳細なエラーメッセージが表示されて、「Unsupported major.minor version xxx」のエラーが発生していた
- プロジェクトで使用する Java のバージョンは統一していたので、注釈処理を動かしているプログラム = Eclipse の JVM のバージョンが古いことが原因っぽいことに気づいた
Eclipse を動かしている JVM のバージョンを確認する
- Eclipse が動いているマシン上でコマンドラインを立ち上げて、
jcmd
を実行する
> jcmd
6184 sun.tools.jcmd.JCmd
18860
- プロセスID しか出力されていないのが Eclipse の Java プロセス
- このプロセスID を引数にして
VM.version
を出力する
> jcmd 18860 VM.version
18860:
Java HotSpot(TM) 64-Bit Server VM version 25.162-b12
JDK 8.0_162
- 8 で動いているのがわかる。
対応方法
- Eclipse を、注釈処理のコードのバージョンと互換性のあるバージョンの Java で動かす
NoClassDefFoundError が発生する
状況
- 注釈処理の中で JavaPoet を使ってソースコードを自動生成しようとした
症状
- 注釈処理のなかで使っている JavaPoet のクラスが見つからずに
NoClassDefFoundError
になる
原因
- Eclipse の注釈処理の設定で、ファクトリー・パスに依存するライブラリが追加されていない
対応方法
- 注釈処理中で使用しているライブラリ(この場合 JavaPoet)もファクトリー・パスに追加する