この記事の翻訳:java.lang.NoClassDefFoundErrorを解決する方法:Java 9でのjavax / xml / bind / JAXBException
私は、JAXBのAPIを使用していますいくつかのコード持っているのJava 6/7/8でのJDKの一部として提供されているクラスを。 私は、Java 6/7/8でのJDKの一部として、いくつかのコードを使用JAXB APIクラス、これらのクラスを持っています提供されます。 Java 9で同じコードを実行すると、実行時にJAXBクラスが見つからないことを示す エラーが発生します。Java9 を使用して同じコードを実行すると、実行時にエラーが発生し、JAXBクラスが見つからないことを示します。
JAXBクラスはJava 6以降、JDKの一部として提供されていますが、なぜJava 9はこれらのクラスを見つけられないのですか? Java 6以降、JAXBクラスはJDKの一部として提供されているので、なぜJava 9はこれらを見つけられないのですか?クラス?
#1階
参照:https : //stackoom.com/question/2wphK/ java-lang-NoClassDefFoundError-Java-でjavax-xml-bind-JAXBExceptionを解決する方法
#2F
JAXB APIはJava EE APIと見なされるため、Java SE 9のデフォルトのクラスパスには含まれなくなりました 。Java11 では、JDKから完全に削除されています。JAXBAPIはJava EE APIと見なされるため、もはやJava SE 9のデフォルトのクラスパスに含まれています。Java 11では、これらはJDKから完全に削除されました。
Java 9ではモジュールの概念が導入されており、デフォルトでは、java.se
集約モジュールはクラスパス(またはモジュールパス)で使用できます。Java9は、モジュール の概念を導入しています。デフォルトでは、java.se
集約モジュールはクラスパス(またはより正確には)にありますモジュールパスで利用できるとしましょう)。 名前で、ASで意味java.se
ない集計モジュールではないバンドルされているJava 6/7/8で伝統的になっている必要がありのJava EEのAPIに含まれています。 名前が示すように、java.se
集約モジュールはしないのJava EEおよびJava 6/7/8伝統的に同梱されるものが挙げられますAPI。
幸いなことに、されたこれらのJava EEのAPI JDK 6/7/8で提供がJDKに残っているが、彼らはただ、デフォルトではクラスパス上にない。 幸いなことに、これらのJava JDK 6/7/8を提供しますEE APIはまだJDKにありますが、デフォルトではクラスパスにありません。 追加のJava EE APIは、次のモジュールで提供されます。 次の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のみ) 迅速かつ汚いソリューション:(のみ9/10 JDK)
JAXBのAPI AT実行時に使用できるようにするために、以下のオプションでコマンドラインを指定します: JAXBのAPIを実行するには、利用可能な場合は、次のコマンドラインオプションを指定してください。 --add-modules java.xml.bind
しかし、Java 8で動作させるにはまだこれが必要です!!!しかし、Java 8で動作させるにはまだこれが必要 です!!! 古いJDKで
指定しようとする--add-modules
と、認識されないオプションであるために失敗します。古いJDKで 指定しようとする--add-modules
と、認識されないオプションであるため、失敗します。2つのオプションのいずれかを提案します。2つのオプションのいずれかを提案します 。
- 任意のJava 9+で使用してあなただけのオプションで設定できる
JDK_JAVA_OPTIONS
環境変数は。 あなたは使用することができJDK_JAVA_OPTIONS
、環境変数の設定のみのJava 9+任意のオプションを。 環境変数は、このIS 自動的に読み取らにすることによりjava
、Java用のランチャー9+。 ジャワ9+java
ますランチャー自動的に読み取らこの環境変数を。 - あなたによってCANの追加
-XX:+IgnoreUnrecognizedVMOptions
には、静かにINSTEAD爆破ザJVMオプションで認識されていないと出て無視。作る あなたが追加することができ-XX:+IgnoreUnrecognizedVMOptions
黙って無視することなく、認識できないJVMオプションに-XX:+IgnoreUnrecognizedVMOptions
。 しかし注意してください! しかし注意してください! 使用する他のコマンドライン引数は、JVMによって検証されなくなります 。JVMは、使用する他のコマンドラインパラメータを検証しなくなります。 このオプションは、Oracle / OpenJDK およびIBM JDK(JDK 8sr4以降)で動作します。このオプションは、Oracle / OpenJDK およびIBM JDK(JDK 8sr4以降)で動作します
代替迅速な解決:(JDK 9/10のみ ) バックアップ迅速な解決:(のみ9/10 JDK)
なお、することができますが、指定することにより、一度にAT RUNの利用可能な上記のJava EEモジュールのすべてのmake --add-modules java.se.ee
オプションを。 してください。なお、指定することで、--add-modules java.se.ee
オプションを、上記のすべてのJava EEモジュールを実行時に使用可能にすることができます。 付属Module1のIS AN集計のModule1 のJava EE APIモジュールの上だけでなく、ザ・を。モジュールを含む、集約モジュールであるとJava EEのAPIモジュールを語りました。注、これは仕事にJavaの11はありませんので、はJavaの11で除去して、これがあることしてくださいノート、Javaの11の仕事をしません、それはJavaの11で削除されているので、java.se.ee
java.se.ee
java.se.ee
java.se.ee
java.se.ee
java.se.ee
適切な長期ソリューション:(JDK 9以降) 正しい長期ソリューション:(JDK 9以降)
上記で列挙されたJava EEのAPIモジュールがすべてマークされている@Deprecated(forRemoval=true)
彼らがされているため、削除される予定でJavaの11。 上記のザ・Java EEのAPIモジュールが標識され@Deprecated(forRemoval=true)
、彼らのように、計画にJavaの11されて 削除されました。 そのため、この--add-module
アプローチはそのままではJava 11で機能しなくなり、Java 11 では--add-module
メソッドをすぐに使用できなくなります。
Java 11以降で実行する必要があるのは、クラスパスまたはモジュールパスに Java EE APIの独自のコピーを含めることです。Java11 以降では、クラスパスまたはモジュールパス上で実行する必要があります。 Java EE APIの独自のコピーが含まれています。たとえば、次のようにJAX-B APIをMaven依存関係として追加できます。たとえば、次のように 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リファレンス実装ページ詳細をON JAXBのため。 についてJAXBの詳細を参照してくださいJAXBリファレンス実装ページを。
完全なJavaのモジュール化の詳細については、を参照してくださいJEP 261:モジュールシステム のJavaモジュール性についての完全な詳細については、参照JEP 261:モジュールシステムを。
GradleまたはAndroid Studio開発者の場合:(JDK 9以降)GradleまたはAndroid Studio開発者の場合:(JDK 9以降 )
次の依存関係をbuild.gradleファイルに追加します。次の依存関係を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"
}
#3階
コンパイルの時と同様にで実行時間、スイッチを追加し--add-modules java.xml.bind
、コンパイルし、実行時に、スイッチを追加します--add-modules java.xml.bind
javac --add-modules java.xml.bind <java file name>
java --add-modules java.xml.bind <class file>
Aの紹介で良いJDK 9
:モジュールはまた、で見つけることができますhttps://www.youtube.com/watch?v=KZfbRuvv5qc また、次にすることができURL関連する検索するJDK 9
モジュールの詳細を:HTTPS://www.youtube.com/見る?v = KZfbRuvv5qc
#4F
これは私のために働きました:これは私のために働きました :
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.7.0</version>
</dependency>
更新 情報
@Jasperが示唆したように、EclipseLinkライブラリ全体への依存を回避するために、EclipseLink MOXyに依存することもできます。@ Jasperが示唆するように、EclipseLinkライブラリ全体への依存を回避するために、 EclipseLink MOXyのみに依存することもできます。
メイベン ・マーヴィン
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.7.3</version>
</dependency>
Gradleの クレードル
compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'
追加の引数なしでJRE 8またはJRE 9の両方で実行できる* .jarを生成する私のJava 8アプリ の依存関係として。私のJava 8アプリケーションの依存関係として、アプリケーションは* .jar、追加のパラメーターなしでJRE 8またはJRE 9で実行できます。
さらに、これはJAXB APIを使用する前にどこかで実行する必要があります。さらに、これはJAXB APIを使用する前にどこかで実行する必要があり ます。
System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");
これまでのところ、回避策として うまく機能し ます。これまでのところ、効果は非常に良好であり、解決策です。しかし、完璧な解決策のようには見えません... それは完璧な解決策のようには見えませんが...
#5F
Java Web Startの実行のために我々は使用することができ 、このようアンディGuibertの提案を: 次のようにJava Web Startの実行のために、私たちは、アンディGuibertの使用を推奨します:
<j2se version="1.6+"
java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>
--add-modulesの余分な "="に 注意し てください。--add-modulesの余分な "="に注意してください。参照してください。このOpenJDKのチケットザ・での「理解ランタイムアクセスの警告」または最後のノートでのJavaプラットフォーム、Standard EditionのOracleのJDK 9移行ガイド。 を参照してください。このOpenJDKのチケットやJavaプラットフォームを、標準版の「Oracle JDK 9移行ガイド」と、「実行するための「アクセス警告」の最後のコメント。
#6階
あなたによって使用することができます--add-modules=java.xml.bind
追加JVMランタイム環境へのバインドXMLにJVMオプションモジュールを。 あなたは使用することができます--add-modules=java.xml.bind
JVMオプションのXMLバインディングモジュールは、JVMランタイム環境に追加されます。
例:java --add-modules=java.xml.bind XmlTestClass
例:java --add-modules=java.xml.bind XmlTestClass