Java9でJAXB
単純なサーバ間のデータ連携アプリをjava9で動かすことにした。
すると
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXB
at Jaxb.main(Jaxb.java:72)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXB
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 1 more
JAXBのライブラリは、Java9からmoduleとして定義され、自動で読み込まれなくなった。
Java9からはモジュールとして、自分で読み込む必要がある。
モジュールの読み込みは、javaコマンドの引数の–add-modulesで指定する。
$ java --add-modules java.xml.bind MyProgram
javax.xml.binはjava.xml.binモジュールに定義されているらしい。
ちなみに、どんなモジュールを利用しているかどうかは、Java9付属のjdepsというコマンドで確認できる。
MyProgram.classを確認してみた。
$ jdeps -cp . -verbose MyProgram.class
MyProgram.class -> .
MyProgram.class -> java.base
MyProgram.class -> java.xml.bind
MyProgram -> Col .
MyProgram -> Data .
MyProgram -> Row .
MyProgram -> java.io.File java.base
MyProgram -> java.io.PrintStream java.base
MyProgram -> java.lang.Class java.base
MyProgram -> java.lang.Exception java.base
MyProgram -> java.lang.Integer java.base
MyProgram -> java.lang.Object java.base
MyProgram -> java.lang.RuntimeException java.base
MyProgram -> java.lang.String java.base
MyProgram -> java.lang.StringBuilder java.base
MyProgram -> java.lang.System java.base
MyProgram -> java.lang.Throwable java.base
MyProgram -> java.util.Iterator java.base
MyProgram -> java.util.List java.base
MyProgram -> javax.xml.bind.JAXB java.xml.bind
最初の方に、利用しているモジュールの一覧が表示された。
その次に、利用しているクラスの一覧が表示された。
Java9のjdepsからは、利用しているクラスの右に、それらが格納されるモジュールが表示される。
これで、利用しているモジュールがわかるので、実行時に指定するようにする。
Project Jigsawは、他人事かと思っていたが、関係してきているようだ。
- EclipseLinkでJPA
- eclipseの良く使うショートカットキー
- eclipseデフォルトの文字コード
- itext5でPDFを暗号化する
- Java DateFormat
- Java8で指定回数繰り返し
- JavaでZip圧縮
- javaでイメージフォーマット変換
- javaでダミー画像作成
- javaでファイルの更新日時を変更する
コメントを残す