1. ホーム
  2. java

[解決済み] java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException を解決するには?

2022-03-19 21:06:19

質問

Java 6/7/8でJDKの一部として提供されたJAXB APIクラスを使用したコードがあります。 同じコードをJava 9で実行すると、実行時にJAXBクラスが見つからないことを示すエラーが表示されます。

JAXBクラスはJava 6からJDKの一部として提供されていますが、なぜJava 9ではこれらのクラスが見つからなくなったのでしょうか?

解決方法は?

JAXB APIはJava EE APIとみなされるため、Java SE 9ではデフォルトクラスパスに含まれなくなりました。 Java 11では、JDKから完全に削除されました。

Java 9 ではモジュールの概念が導入され、デフォルトで java.se 集約モジュールはクラスパス(というかモジュールパス)上で利用可能です。その名前が示すように java.se アグリゲートモジュールは ない には、従来からJava 6/7/8にバンドルされているJava EE APIが含まれています。

幸い、JDK 6/7/8で提供されていたこれらのJava EE APIは、JDKに残っていますが、デフォルトでクラスパス上にないだけです。余分なJava EE APIは、以下のモジュールで提供されています。

java.activation
java.corba
java.transaction
java.xml.bind  << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation

手っ取り早い解決策 (JDK 9/10のみ)

JAXB APIを実行時に利用できるようにするには、以下のコマンドラインオプションを指定します。

--add-modules java.xml.bind

でも、やっぱりJava 8で動くようにしないと!!!。

を指定してみると --add-modules を古いJDKで使用すると、認識できないオプションであるため、吹き飛んでしまいます。2つのオプションのいずれかをお勧めします。

  1. Java 9+ のみのオプションを設定する場合は JDK_JAVA_OPTIONS 環境変数を使用します。この環境変数は 自動読み取り によって java Java 9+ 用のランチャーです。
  2. を追加することができます。 -XX:+IgnoreUnrecognizedVMOptions を使うと、JVMは認識できないオプションを吹き飛ばすのではなく、黙って無視するようになります。しかし、注意してください! あなたが使う他のどんなコマンドライン引数も、もはやJVMによってあなたのために検証されることはないのです。このオプションは、IBM JDK(JDK8sr4の時点)と同様に、Oracle/OpenJDKで動作します。

代替の迅速な解決策 (JDK 9/10のみ)

なお、上記のJava EEモジュールは、実行時に --add-modules java.se.ee オプションで指定します。このオプションは java.se.ee を含むアグリゲートモジュールです。 java.se.ee と、上記のJava EE APIモジュールです。なお、この は、Java 11では動作しません。 というのも java.se.ee はJava 11で削除されました。


長期的な適切な解決策 (JDK 9 以降)

上記のJava EE APIモジュールには、すべて @Deprecated(forRemoval=true) であるため 削除予定 ジャバ11 . そのため --add-module のアプローチは、Java 11ですぐに動作しなくなります。

Java 11以降で必要となるのは、クラスパスまたはモジュール・パスにJava EE APIの独自のコピーを含めることです。たとえば、JAX-B APIをMavenの依存関係として追加するには、以下のようにします。

<!-- API, java.xml.bind module -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- Runtime, com.sun.xml.bind module -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>

をご覧ください。 JAXBリファレンス実装のページ は、JAXB の詳細です。

Java のモジュール化の詳細については JEP 261。モジュールシステム

GradleまたはAndroid Studioの開発者向け。(JDK 9以降)

以下の依存関係を build.gradle ファイルを作成します。

dependencies {
    // JAX-B dependencies for JDK 9+
    implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
    implementation "org.glassfish.jaxb:jaxb-runtime:2.3.2"
}