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


845

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

JAXBクラスはJava 6以降、JDKの一部として提供されていますが、なぜJava 9はこれらのクラスを見つけられないのですか?


2
この回答の追加部分、これらのAPIの移行に関連しています。
ナマン2017年

7
Java 8でビルドすると、コードはコンパイルされますが、Java 9以降でコンパイルされたコードを実行しようとすると、JAX-Bが存在しないために失敗します。
アンディギベール2018年

1
Java 11の場合、この記事のソリューションは最新です。crunchify.com
Eric Wang

回答:


1224

JAXB APIはJava EE APIと見なされるため、Java SE 9のデフォルトのクラスパスに含まれなくなりました。Java11では、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. JDK_JAVA_OPTIONS環境変数を使用して、Java 9以降のみのオプションを設定できます。この環境変数は、Java 9以降のランチャーによって自動的に読み取らjavaます。
  2. を追加-XX:+IgnoreUnrecognizedVMOptionsすることで、JVMを爆発させる代わりに、認識されないオプションを警告なしで無視することができます。しかし注意してください!使用する他のコマンドライン引数は、JVMによって検証されなくなります。このオプションは、Oracle / OpenJDKおよびIBM JDK(JDK 8sr4以降)で機能します。

別のクイックソリューション:(JDK 9/10のみ)

--add-modules java.se.eeオプションを指定することにより、実行時に上記のすべてのJava EEモジュールを使用可能にできることに注意してください。java.se.eeモジュールは、集約モジュールであるjava.se.eeだけでなく、上記のJava EE APIモジュール。これはJava 11java.se.eeで削除されたため、Java 11では機能しません


適切な長期的ソリューション:(JDK 9以降)

上記のJava EE APIモジュールは、Java 11 での削除@Deprecated(forRemoval=true)予定されているため、すべてマークされています。したがって、この--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:Module Systemを参照してください。

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"
}

8
Java EE APIモジュールが非推奨とマークされている場合、それは、Java 10の実行時にJAXBがJava 10で使用できなくなる可能性があることを意味しますか?それは一歩後ろのようです。依存関係としてJAXBを含めるという6以前のプラクティスに戻る必要があります。
マイケル

4
回避策として--add-modules java.se.eeまたは--add-modules ALL-SYSTEMを使用することは、移行ガイドのdocs.oracle.com/javase/9​​/migrate のセクション「Java EEと共有されていないモジュールで推奨されていませんデフォルトで解決->ポイント1
justMe '20 / 10/20

6
Java 10が正式にリリースされたので、add-modulesメソッドが引き続き機能することを確認できます。javax.xml.bindおよび他のJavaEEクラスはあたり、Java(登録商標)11で除去するために予定されているJEP-320
Joep Weijers

10
そして今、Java 11がリリースされ、java.se.eeモジュールが削除されたため、--add-modulesソリューションは動作しなくなりました。代わりに、推奨されるソリューションを使用してください。JAXBを別の依存関係として追加します。
Jesper、

11
これらの依存関係を追加しても、同じエラーが発生します。なぜ何かアイデア?
ジョアン・ヴィエイラ

262

私の場合(春のブートファットjar)、pom.xmlに以下を追加するだけです。

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>


9
このようなgradle依存関係を追加すると、testCompile('javax.xml.bind:jaxb-api')うまくいきました。
pamcevoy

5
前述の@pamcevoyのように、Spring Bootを使用する場合、jaxb-apiのバージョンを指定する必要はありません。ブートはバージョンを自動的に管理します。
マルセルオーバーダイク2018

2
<scope>runtime</scope>そのような場合に使用することをお勧めします
VladS

5
Tunoのリンクが私のために動作しませんでした@、固定リンクは次のとおりです。github.com/spring-projects/spring-boot/wiki/...
サンフランシスコサンマテオ

69

最近のJDK 9.0.1では、これらのソリューションはどれもうまく機能しませんでした。

この依存関係のリストは適切に機能するのに十分であるため、明示的に指定する必要はありません--add-module(これらの依存関係のpom内で指定されています)。必要なのは、この依存関係のリストを指定することだけです。

<dependencies>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>

2
JDK 8の場合、jaxb-coreおよびjaxb-implを上から削除します。
foo

3
@Anilこれはpom.xmlMaven構成のファイルです。それが何であるかわからない場合は、最初から始めることをお勧めします
Andremoniy

8
不正なリフレクトアクセス操作が発生しました警告:com.sun.xml.bind.v2.runtime.reflect.opt.Injectorによる不正なリフレクトアクセス(ファイル:/ C:/Users/eis/.m2/repository/com/sun/ xml / bind / jaxb-impl / 2.3.0 / jaxb-impl-2.3.0.jar)からメソッドjava.lang.ClassLoader.defineClass(java.lang.String、byte []、int、int)へ警告:考慮してくださいこれをcom.sun.xml.bind.v2.runtime.reflect.opt.Injectorのメンテナーに報告する警告:--illegal-access = warnを使用して、さらに不正なリフレクティブアクセス操作の警告を有効にします警告:すべての不正なアクセス操作は将来のリリースで拒否される
Stefan

1
これはJDK 9.0.4で機能しました(Maven 3.5.3のMavenプラグインを介してJAXB関連のコードを呼び出していました)。<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>最後の依存関係として使用しますが。
scrutari

1
驚くばかり。何らかの理由で、春のブートアプリがMacではEclipseでなくEclipseで実行され、Win10ではEclipseで実行されない状況がありました。2つのプラットフォームの1つのIDEで作業できることは利点です。
kometen

42

これは私のために働きました:

<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だけに依存することもできます。

メイベン

<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'

私のJava 8アプリの依存関係として、追加の引数なしでJRE 8またはJRE 9の両方で実行できる* .jarを生成します。

さらに、これはJAXB APIを使用する前にどこかで実行する必要があります。

System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");

これまでのところ、回避策としてうまく機能します。しかし、完璧な解決策のようには見えません...


5
org.eclipse.persistence:eclipselinkJAXB APIを取得するためだけに追加することは、すでにeclipselinkを使用しているのでない限り、非常に大きな依存関係です。
アンディギベール2017

4
はい、それは重いです(〜9mb)そして、私はすでにそれを使っています。これは、おそらく一時的なもので、コマンドライン引数を指定せずに同じjar / warに8および9の両方のJREを使用する必要がある人のための代替の回避策であると述べました。
ミハイルホロドコフ2017

2
JDK 8と9の間の相互運用のために、-XX:+IgnoreUnrecognizedVMOptionsコマンドラインオプションを使用することをお勧めします(詳細で私の回答を更新しました)
Andy Guibert

System.setProperty( "javax.xml.bind.JAXBContextFactory"、 "org.eclipse.persistence.jaxb.JAXBContextFactory"); 私のために動作しません
デビッドブロサール2018

1
EclipseLinkライブラリ全体に依存しないようにするには、EclipseLink MOXy:groupId org.eclipse.persistence、artifactId だけに依存することもできますorg.eclipse.persistence.moxy
Jesper

36

すべてのJDKのクリーンなソリューション> = 9

ビルドに2つの依存関係を追加する必要があります

  • jaxb-api
  • jaxb実装

実装として、私はグラスフィッシュによるリファレンス実装を使用して、古いcom.sunクラス/ライブラリを取り除くことを選択しました。その結果、私は私のmavenビルドに追加しました

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.1</version>
</dependency>

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.1</version>
</dependency>

バージョン2.3.1以降では、javax.activationを追加する必要がないことに注意してください。(https://github.com/eclipse-ee4j/jaxb-ri/issues/1222を参照)


javax.xml.bindモジュールは本当に必要ですか?JDK 11の私のコードはそれなしで動作します。
k.liakos

@ k.liakosわかりません。jaxb-runtime jarとapi-jarは、同じクラス/パッケージを共有しません。それはあなたのコードに依存すると思います。コードがパッケージ「javax.xml.bind」のクラスを使用しない場合、おそらくそれは必要ありません。このスレッドのトピックは、「javax / xml / bind / JAXBException」が見つからないことです。このクラスはjaxb-apiにのみあります。
Sebastian Thees

1
Javaの12でマルチモジュールプロジェクトで完璧に動作します
Heril Muratovic

35

これは、jdk 9以降のバージョンを使用している場合、javaバージョンがこれをpomに追加するだけだからです。

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>

1
私はいつもSpring Bootガイドでこれに遭遇します...おかげでトン。
masterxilo 2018年

2
@Cesar Rodriguez Tさん、これをSwaggerの例で試してみましたが、コンパイルは機能しましたが、実行するとエラーが発生しました。私はより多くの依存関係を含む選択された回答を使用しましたが、それはうまくいきました。
PatS 2018年

プロジェクトのpom.xmlファイル
Cesar Rodriguez T

22

これを解決するために、プロジェクトにいくつかのJARファイルをインポートしました。

  • javax.activation-1.2.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar

  • jaxb-api-2.3.0.jar

http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar

  • jaxb-core-2.3.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar

  • jaxb-impl-2.3.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar

  1. 上記のファイルをダウンロードして、プロジェクトのlibsフォルダーにコピーします
  2. インポートしたJARファイルをJavaビルドパスに追加する

4
com.sun.xml.bindアーティファクトは古く、下位互換性のためにのみ提供されていることに注意してください。org.glassfish.jaxb他のいくつかの回答で述べたように、代わりに同等のアーティファクトを使用する必要があります。
Jesper

これは私にはうまくいきませんでした。エラーが発生し、特定のクラスが見つからなかったとのことです。
RamenChef 2018年

Grails 3.4.10アプリケーションをデプロイするときに、それらをMint 19.2(Ubuntu 18.04ベース)の下のtomcat9 / libフォルダーに配置すると、うまくいきました。
Mohamad Fakih


11

これでうまくいきました。jaxb-apiのみを追加するだけでは不十分でした。

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>

そして、jaxb-api.versionは何に設定されましたか?
MiguelMunoz

@MiguelMunoz私は2.2.7を使用しました
ジェダイ氏

2
com.sun.xml.bindアーティファクトは古く、下位互換性のためにのみ提供されていることに注意してください。org.glassfish.jaxb他のいくつかの回答で述べたように、代わりに同等のアーティファクトを使用する必要があります。
Jesper、

11

Your Build.gradleに移動し、Java 9またはJava 10の両方の依存関係を以下に追加します。

sourceCompatibility = 10 // You can also decrease your souce compatibility to 1.8 

//java 9+ does not have Jax B Dependents

    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.0'
    compile group: 'javax.activation', name: 'activation', version: '1.1.1'

11

--add-modules=java.xml.bindJVMオプションを使用して、xmlバインドモジュールをJVMランタイム環境に追加できます。

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


11

2019年4月の更新

JAXBリリースのChangelongはhttps://javaee.github.io/jaxb-v2/doc/user-guide/ch02.htmlにあります

抜粋:

    4.1. Changes between 2.3.0.1 and 2.4.0

         JAXB RI is now JPMS modularized:

            All modules have native module descriptor.

            Removed jaxb-core module, which caused split package issue on JPMS.

            RI binary bundle now has single jar per dependency instead of shaded fat jars.

            Removed runtime class weaving optimization.

    4.2. Changes between 2.3.0 and 2.3.0.1

          Removed legacy technology dependencies:

            com.sun.xml.bind:jaxb1-impl

            net.java.dev.msv:msv-core

            net.java.dev.msv:xsdlib

            com.sun.xml.bind.jaxb:isorelax

    4.3. Changes between 2.2.11 and 2.3.0

          Adopt Java SE 9:

            JAXB api can now be loaded as a module.

            JAXB RI is able to run on Java SE 9 from the classpath.

            Addes support for java.util.ServiceLoader mechanism.

            Security fixes

信頼できるリンクはhttps://github.com/eclipse-ee4j/jaxb-ri#maven-artifactsにあります

JAXBアーティファクトのMaven座標

jakarta.xml.bind:jakarta.xml.bind-api:JAXBのAPIクラス。JAXBに対してコンパイルする必要があります。

org.glassfish.jaxb:jaxb-runtime:JAXBの実装。xmlとの間のJavaオブジェクトの直列化および非直列化に使用されるランタイム。

JAXB fat-jarバンドル:

com.sun.xml.bind:jaxb-impl:JAXBランタイムファットjar。

org.glassfish.jaxbアーティファクトとは対照的に、これらのjarにはすべての依存関係クラスが含まれています。これらの成果物には、JPMSモジュール記述子は含まれていません。Mavenプロジェクトでは、org.glassfish.jaxbアーティファクトが代わりに使用されることになっています。

org.glassfish.jaxb:jaxb-runtime:jar:2.3.2は以下をプルします:

[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.2:compile
[INFO] |  +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
[INFO] |  +- org.glassfish.jaxb:txw2:jar:2.3.2:compile
[INFO] |  +- com.sun.istack:istack-commons-runtime:jar:3.0.8:compile
[INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.8.1:compile
[INFO] |  +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.16:compile
[INFO] |  \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile

元の回答

以下のどのアーティファクト私は私のMavenプロジェクトでJAXB RIのために使うべきでしょうか? Mavenでは、次のようなプロファイルを使用できます。

<profile>
    <id>java-9</id>
    <activation>
        <jdk>9</jdk>
    </activation>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
</profile> 

依存関係ツリーは以下を示します:

[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.0:compile
[INFO] |  +- org.glassfish.jaxb:jaxb-core:jar:2.3.0:compile
[INFO] |  |  +- javax.xml.bind:jaxb-api:jar:2.3.0:compile
[INFO] |  |  +- org.glassfish.jaxb:txw2:jar:2.3.0:compile
[INFO] |  |  \- com.sun.istack:istack-commons-runtime:jar:3.0.5:compile
[INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.7.8:compile
[INFO] |  \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.13:compile
[INFO] \- javax.activation:activation:jar:1.1.1:compile

これをEclipseで使用するには、Oxygen.3aリリース(4.7.3a)以降、Ctrl-Alt-P、またはプロジェクトMavenを右クリックして、プロファイルを選択します。


他の場所で見たjavax.xml.bind>の依存関係jaxb-apiは実際には冗長であることを示してくれてありがとう。Glassfish依存関係はそれを引き出します。私はちょうどそれを試してみました、そしてそれは確かに機能します。
バジルブルク2018


8

pom.xmlにjavax.xml.bind依存関係を追加します

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>

8

JavaEEはhttps://jakarta.ee/によって管理されるようになったため、2.3.2 以降の新しいMaven座標は次のとおりです。

https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts

最初にリリースされたjaxb.versionは2.3.2です。

<properties>
  <jaxb.version>2.3.2</jaxb.version>
</properties>

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>${jaxb.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>${jaxb.version}</version>
</dependency>

7

私はこのURLをたどり、以下の設定が本当に役に立ちました。Macbook ProのSTS IDEでJava 10を使用しています。それは魅力のように働きます。

   <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>javax.activation-api</artifactId>
    <version>1.2.0</version>
</dependency>

7

これにより、Java 12でApache Camel 2.24.1を実行する依存関係に関する私の問題が解決されました。

    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0.1</version>
    </dependency>

私の場合、pomファイルにtomcat依存関係を追加する必要があります
GvSharma

6

2.0.5.RELEASEJava 11でSpring Boot を使用して同じ問題が発生しました。

javax.xml.bind:jaxb-api:2.3.0単独で追加しても問題は解決しませんでした。また、Spring Bootを最新のMilestoneに更新する必要があった2.1.0.M2ので、次の公式リリースで修正されると思います。


これは私には関係ありません。このスレッドには、Spring Boot 2の使用に関係なく機能するいくつかのソリューションがあります(私はSpring Boot 2.0.5.RELEASE btwも使用しています)。たぶんSpring 2.1.0.M2にはjaxbランタイムがすでに含まれています。
Sebastian Thees

Spring Boot 2.1.0.RELEASEでは、JAXBはもう必要ないようです-github.com/spring-projects/spring-boot/releases
Burrich

5

JDK 9+を使用する場合は、JAX-B依存関係を追加する必要があります。Android Studioユーザーの場合、これをbuild.gradledependencies {}ブロックに追加する必要があります。

// Add missing dependencies for JDK 9+
if (JavaVersion.current().ordinal() >= JavaVersion.VERSION_1_9.ordinal()) {
    // If you're using @AutoValue or any libs that requires javax.annotation (like Dagger)
    compileOnly 'com.github.pengrad:jdk9-deps:1.0'
    compileOnly 'javax.annotation:javax.annotation-api:1.3.2'

    // If you're using Kotlin
    kapt "com.sun.xml.bind:jaxb-core:2.3.0.1"
    kapt "javax.xml.bind:jaxb-api:2.3.1"
    kapt "com.sun.xml.bind:jaxb-impl:2.3.2"

    // If you're using Java
    annotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"

    testAnnotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    testAnnotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
}

ただし、単体テストでは機能しません
Malachiasz

ユニットテストでも機能するように、回答を変更しました。
Malachiasz

4

また、Java 11

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

javax.xml.bind:jaxb-apiまたはスプリングブートjakarta.xml.bind-apiを追加することでこのすべてのものを試しました.. jjwtバージョン0.10.0で修正のヒントを見つけましたが、最も重要なのは、jjwtパッケージが今分割!

したがって、この参照を確認してください:https : //github.com/jwtk/jjwt/issues/510

単に、あなたが使うなら

Java11とjjwt 0.9.xでClassNotFoundException:javax.xml.bind.DatatypeConverterの問題に直面した

をやる

jjwtバージョン0.11.x、ただし分割パッケージを使用:https : //github.com/jwtk/jjwt#install

パッケージを分割しているため、jjwt依存関係の上位バージョンは見つかりません。

乾杯。


3

答えではありませんが、補遺:groovyshJAVA_HOMEがJava 9のインストール(java version "9.0.1"正確には)を指している場合(Groovy 2.4.13)を実行すると失敗するため、次のようになりました:

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
        at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
        at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
        at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
        ...
        ..
        .
        ..
        ...
        at org.codehaus.groovy.tools.shell.Groovysh.<init>(Groovysh.groovy:135)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.<init>(Main.groovy:66)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
... 6 more

解決策は:

  • github.ioでJAXBプロジェクトに移動します「JAXBはデュアルライセンスの下でライセンスされています-CDDL 1.1とGPL 2.0、クラスパス例外あり」

  • ダウンロード jaxb-ri-2.3.0.zip

  • Javaインフラストラクチャファイル(私の場合は/usr/local/java/jaxb-ri/)を配置する場所に解凍します。他の解決策が存在する可能性があります(おそらくSDKMANを介して、私は知りません)

  • libサブディレクトリのjarがにあることを確認してくださいCLASSPATH。私は、bashの起動時に開始されると呼ばれるスクリプトを介してそれを行います/etc/profile.d/java.sh。ここで、他の多くの行の中で次のループを追加しました。

関数にパックされています...

function extend_qzminynshg {
   local BASE="/usr/local/java"
   for LIB in jaxb-api.jar  jaxb-core.jar  jaxb-impl.jar  jaxb-jxc.jar  jaxb-xjc.jar; do
      local FQLIB="$BASE/jaxb-ri/lib/$LIB"
      if [[ -f $FQLIB ]]; then
         export CLASSPATH=$FQLIB:$CLASSPATH
      fi
    done
}

extend_qzminynshg; unset extend_qzminynshg

そしてそれはうまくいきます!


1
私は反対意見を理解していません。どうやら人々は実際にjarファイルを取得するのではなく、コマンドラインオプションを試してみたいと思っていますか?自分に合う。
David Tonhofer

7
Java開発者は通常、jarを手動でダウンロードするのではなく、GradleやMavenなどのビルドツールを使用して依存関係を管理します。それがおそらく反対票の理由です。
ジョシュアデイビス


2

はい、同じ種類の問題が発生していますが、Java 8を使用していて、このエラーが発生し続けたため、ほとんどの解決策を試しました。しかし、私がグローバルJavaバージョンを8に設定したとしても、私のmavenはまだJava 9を指していることがわかりました。

この種の問題が発生する可能性のある人は、MavenがデフォルトのJavaを使用するように修正する方法を確認してください。


2

古い回答「amazoncorrettoに切り替えることで問題が解決しました」ニュースの回答:corretto latestを使用しましたが、jdk 1.8と似ています。とにかく手動で依存関係を追加する必要があります


2
JDK 11のAmazon Correttoディストリビューションは、javax.xml.bindクラスを提供しません。問題がCorretoに切り替えた後に解決された場合は、JDK 8に格下げので、それはだった
アンディGuibert

奇妙なことに、私はチェックします、ドッカーで最新のcorretoを使用しました
Armen Arzumanyan

いや、amazoncorretto:latest現在、JDK 8与え、ない11.多くのドッカー画像はまだ、JDK 8に基づいているからこそ、JDK 8の間でAPIの除去に起因する互換性の問題の- > 11
アンディGuibert

2

Java 8ターゲット用にコンパイルするときに使用する必要がある依存関係バージョン。Java 8、11、および12 JREでテストされたアプリケーション。

        <!-- replace dependencies that have been removed from JRE's starting with Java v11 -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.8</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.8-b01</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.8-b01</version>
        </dependency>
        <!-- end replace dependencies that have been removed from JRE's starting with Java v11 -->

2

私にとってJava 11とgradleの場合、これがうまくいきました:

plugins {
      id 'java'
}

dependencies {
      runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}

正確にどこに置くのですか?
nyxee

Gradleを使用している場合は、build.gradleファイル内。
silver_mx

1

Mavenにjaxb依存関係を追加する必要があります。glassfish実装バージョン2.3.2は、新しいjakarta EE jaxb apiバージョン2.3.2と完全に互換性があります。

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

<!-- Runtime -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>

1

私はJavaの11に私のプロジェクトをアップグレードした後、同様の問題を持っていたし、何が、それは明らかにJavaの11をサポートしています春のブート2.1.1にアップグレードした固定、これは助け


URLが将来変更された場合、リンクのみの回答は無効になるため、回答に少なくともソリューションの一部を追加することを検討してください。
鹿島フクサイ

0

私はパーティーに遅れていることはわかっていますが、私のエラーは別の解決策を必要としました...超単純すぎる

私はもともとTomcat 9にデプロイしていて、7が必要だと気付いた... build.xmlでクラスパスを7バージョンに戻すのを忘れていました

うまくいけば、これが将来的に他の誰かのエラーを修正し、私がしたようにこの単純な問題を見逃してしまったことを願っています!


2
これはOPに役立つかもしれませんが、詳細、例などを追加することをお
Tiw

0

jaxws-maven-pluginこの依存関係を追加するだけでSOAP Webサービスを(たとえばを使用して)呼び出す場合、すべてのJAXBエラーが消えます。

<dependency>
            <groupId>org.glassfish.metro</groupId>
            <artifactId>webservices-rt</artifactId>
            <version>2.4.3</version>
</dependency>

Java 13でテスト済み

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.