Java9でJAXB
単純なサーバ間のデータ連携アプリをjava9で動かすことにした。
すると
1 2 3 4 5 6 7 | 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で指定する。
1 | $ java --add-modules java.xml.bind MyProgram |
javax.xml.binはjava.xml.binモジュールに定義されているらしい。
ちなみに、どんなモジュールを利用しているかどうかは、Java9付属のjdepsというコマンドで確認できる。
MyProgram.classを確認してみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ 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でファイルの更新日時を変更する
同じカテゴリの記事