Java 9でjava.lang.NoClassDefFoundError:javax / xml / bind / JAXBExceptionを解決する方法

この記事の翻訳: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つのオプションのいずれかを提案します

  1. 任意のJava 9+で使用してあなただけのオプションで設定できるJDK_JAVA_OPTIONS環境変数は。 あなたは使用することができJDK_JAVA_OPTIONS、環境変数の設定のみのJava 9+任意のオプションを。 環境変数は、このIS 自動的に読み取らにすることによりjava、Java用のランチャー9+。 ジャワ9+ javaますランチャー自動的に読み取らこの環境変数を。
  2. あなたによって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.eejava.se.ee java.se.eejava.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.bindJVMオプションのXMLバインディングモジュールは、JVMランタイム環境に追加されます。

例:java --add-modules=java.xml.bind XmlTestClass 例:java --add-modules=java.xml.bind XmlTestClass

公開された0件の元の記事 賞賛された8件 30,000回以上の閲覧

おすすめ

転載: blog.csdn.net/asdfgh0077/article/details/105481637