[解決済み] java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException を解決するには?
質問
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つのオプションのいずれかをお勧めします。
-
Java 9+ のみのオプションを設定する場合は
JDK_JAVA_OPTIONS
環境変数を使用します。この環境変数は 自動読み取り によってjava
Java 9+ 用のランチャーです。 -
を追加することができます。
-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"
}
関連
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
ローカルリソースのロードが許可されていない場合の解決策
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
-
[解決済み] Javaにおけるチェック済み例外とチェックされていない例外の理解
-
[解決済み] android-sdkのインストールに失敗しました。"java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema" を実行しました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java の例外が発生しました java
-
Spring Boot による HTTPS アクセスの設定
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
プロローグでのコンテンツは禁止されています
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
JSPで「リストが型解決できない!」の解決方法
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策
-
[解決済み】Java 11 パッケージ javax.xml.bind が存在しない [重複]。