web-dev-qa-db-ja.com

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

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

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

493
Andy Guibert

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

Java 9ではモジュールの概念が導入されており、デフォルトではJava.se集合モジュールがクラスパス(あるいはモジュールパス)で利用可能です。その名前が示すように、Java.se集約モジュールはnotを含みません)は伝統的にJava 6/7/8にバンドルされています。

幸い、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で動作するためにこれが必要です!
古いJDKで--add-modulesを指定しようとすると、それが認識できないオプションであるため、爆発します。私は2つの選択肢のうちの1つを提案します:

  1. $Java_HOME/releaseプロパティのJava_VERSIONを調べることでJDKバージョンを調べることによって、起動スクリプト(存在する場合)に引数を条件付きで適用できます。
  2. -XX:+IgnoreUnrecognizedVMOptionsを追加して、JVMに、認識されないオプションを黙って無視させるようにすることができます。しかし用心しなさい!他に使用したコマンドライン引数は、JVMによって検証されなくなります。このオプションは、Oracle JDKおよびIBM JDK(JDK 8sr 4以降)で機能します。

代替の迅速な解決策:(JDK 9/10のみ)
--add-modules Java.se.eeオプションを指定することで、実行時に上記のすべてのJava EEモジュールを使用可能にすることができます。 Java.se.eeモジュールは、Java.se.eeと上記のJava EE APIモジュールを含む集約モジュールです。


適切な長期的解決策:(すべてのJDKバージョン)

上記のJava EE APIモジュールはすべて@Deprecated(forRemoval=true)とマークされています。これらは 削除予定 in Java 11 です。そのため--add-moduleアプローチはJava 11ではそのままでは機能しません。 

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

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>com.Sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>com.Sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

Javaモジュール性の詳細については、 JEP 261:Module System を参照してください。 

761
Andy Guibert

私の場合(スプリングブートファットジャー)、pom.xmlに以下を追加するだけです。

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

最近の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>
57
Andremoniy

これは私のために働いた:

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

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

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

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

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

35

それはあなたがjdk 9またはそれ以降のバージョンを使用しているならJavaバージョンがあなたのPOMにこれを単に追加するからです

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

実行時だけでなくコンパイル時にも、スイッチ--add-modules Java.xml.bindを追加します。

javac --add-modules Java.xml.bind <Java file name>

Java --add-modules Java.xml.bind <class file>

JDK 9モジュールの良い紹介はまた以下で見つけることができます: https://www.youtube.com/watch?v=KZfbRuvv5qc

15
Pallavi Sonal

--add-modules=Java.xml.bind JVMオプションを使用すると、xml bindモジュールをJVMランタイム環境に追加できます。

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

11

これを解決するために、私は自分のプロジェクトにいくつかの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/un/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar

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

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'
9
Kumar Abhishek

これは私のために働きました。 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>
9
Mr Jedi

Java Web Start Executionでは、Andy Guibertの提案をこのように使用できます。

<j2se version="1.6+" 
      Java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=Java.se.ee"/>

--add-modulesの余分な "="に注意してください。 このOpenJDKチケット または Java Platform、Standard Edition Oracle JDK 9移行ガイド の「ランタイムアクセスの警告について」の最後の注意を参照してください。

8
mvw

すべてのJDKに対するクリーンな解決法> = 9

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

  • jaxb-api
  • jaxbの実装

実装として、私はglassfishによる参照実装を使って、古いcom.Sunクラス/ライブラリを取り除きました。

<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 を参照)

7
Sebastian Thees

フォロー中 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 Release(4.7.3a)以降、Ctrl-Alt-P、またはプロジェクトMavenを右クリックしてからプロファイルを選択します。

7
JasonPlutext

私はこの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>
4
itsraghz

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

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

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

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

3
Javide

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

https://github.com/Eclipse-ee4j/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>
3
dschulten

答えではありませんが補遺:Java_HOMEがJava 9のインストール(正確にはJava version "9.0.1")を指している場合にgroovysh(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

解決策は以下のとおりです。

  • JAXBプロジェクト github.ioにアクセスしてください( "JAXBはデュアルライセンスでライセンスされています - CDDL 1.1とGPL 2.0(クラスパス例外付き)"

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

  • Javaインフラストラクチャファイルをどこに置いても解凍します(私の場合は/usr/local/Java/jaxb-ri/)。他の解決策が存在するかもしれません(多分SDKMANを介して、私はdunno)

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

関数に詰め込まれています...

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

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

2
David Tonhofer

OK、私は同じ種類の問題を抱えていました、しかし私はJava 8を使用していました、そして、このエラーを得続けました、私はほとんどの解決策を試みました。グローバルJavaを8に設定したにもかかわらず、私のMavenはまだJava 9を指していたことが判明したので、このような問題を抱えている可能性のあるすべての機関については、デフォルトのJavaを使うようにMavenを修正するには) https://blog.tompawlak.org/maven-default-Java-version-mac-osx

1
Ipkiss

昔の答え "amazoncorrettoに切り替えて解決した問題"ニュースの答え:最新のCorrettoを使いましたが、jdk 1.8に似ています。とにかく手動で依存関係を追加する必要があります

1

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

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

うまくいけば、これは私がしたようにこの単純な問題を見逃すことができる人、他の誰かの間違いを将来修正するでしょう!

0
Tyler Miles

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 -->
0
Chris

これは私にとってはうまくいきました。Java8でコンパイルするSpring Bootプロジェクトがありますが、いつか私のMavenがJava 11でコンパイルを開始したのか、Ubuntuでそれを修正していた理由がわかりません。

Sudo update-Java-alternatives  -l

それは私のPC上で利用可能なJDKを私に示した:

Java-1.11.0-openjdk-AMD64      1111       /usr/lib/jvm/Java-1.11.0-openjdk-AMD64

Java-1.8.0-openjdk-AMD64 1081 /usr/lib/jvm/Java-1.8.0-openjdk-AMD64

それで、私はついにこのコマンドを実行して希望のものを選択します。

Sudo update-Java-alternatives  -s Java-1.8.0-openjdk-AMD64 

これで、/を詳しく見てみるために、 コマンド更新の代替方法の使い方

0

Jaxb依存関係をmavenに追加する必要があります。 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>
0
krishna Telgave

Java 11およびgradleの私にとって、これがうまくいったものです:

plugins {
      id 'Java'
}

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

これにより、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>
0
kachanov