Java9でJAXB

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

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

コメントを残す

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

CAPTCHA