Java9でJAXB

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は、他人事かと思っていたが、関係してきているようだ。

同じタグの記事
同じカテゴリの記事

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA