私は、Java 6/7/8でJDKの一部として提供されているJAXB APIクラスを使用するコードをいくつか持っています。 Java 9で同じコードを実行すると、実行時にJAXBクラスが見つからないことを示すエラーが表示されます。
JAXBクラスは、Java 6以降JDKの一部として提供されていますが、Java 9がこれらのクラスを見つけられなくなったのはなぜですか?
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つを提案します:
$Java_HOME/release
プロパティのJava_VERSION
を調べることでJDKバージョンを調べることによって、起動スクリプト(存在する場合)に引数を条件付きで適用できます。-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 を参照してください。
私の場合(スプリングブートファットジャー)、pom.xmlに以下を追加するだけです。
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
最近の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>
これは私のために働いた:
<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");
回避策として、これまでのところうまく機能します。しかし完璧な解決策のようには見えません...
それはあなたがjdk 9またはそれ以降のバージョンを使用しているならJavaバージョンがあなたのPOMにこれを単に追加するからです
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
実行時だけでなくコンパイル時にも、スイッチ--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
--add-modules=Java.xml.bind
JVMオプションを使用すると、xml bindモジュールをJVMランタイム環境に追加できます。
例:Java --add-modules=Java.xml.bind XmlTestClass
これを解決するために、私は自分のプロジェクトにいくつかのJARファイルをインポートしました。
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-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
http://search.maven.org/remotecontent?filepath=com/un/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar
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'
これは私のために働きました。 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>
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移行ガイド の「ランタイムアクセスの警告について」の最後の注意を参照してください。
すべてのJDKに対するクリーンな解決法> = 9
ビルドに2つの依存関係を追加する必要があります
実装として、私は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 を参照)
フォロー中 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を右クリックしてからプロファイルを選択します。
私はこの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>
pom.xmlにjavax.xml.bind依存関係を追加しました
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
Java 11でSpring Boot 2.0.5.RELEASE
を使用しても同じ問題が発生しました。
javax.xml.bind:jaxb-api:2.3.0
を単独で追加しても問題は解決しませんでした。私はまた、Spring Bootを最新のMilestone 2.1.0.M2
に更新しなければならなかったので、これは次の公式リリースで修正されると思います。
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>
答えではありませんが補遺: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
そしてそれはうまくいきます!
OK、私は同じ種類の問題を抱えていました、しかし私はJava 8を使用していました、そして、このエラーを得続けました、私はほとんどの解決策を試みました。グローバルJavaを8に設定したにもかかわらず、私のMavenはまだJava 9を指していたことが判明したので、このような問題を抱えている可能性のあるすべての機関については、デフォルトのJavaを使うようにMavenを修正するには) https://blog.tompawlak.org/maven-default-Java-version-mac-osx
昔の答え "amazoncorrettoに切り替えて解決した問題"ニュースの答え:最新のCorrettoを使いましたが、jdk 1.8に似ています。とにかく手動で依存関係を追加する必要があります
私はパーティーに遅刻していることを知っています、しかし私のエラーは別の解決策を必要とすることになりました...超単純すぎる
私はもともとTomcat 9を廃止し、7が必要だと気付きました。build.xmlでクラスパスを7バージョンに戻すのを忘れていました。
うまくいけば、これは私がしたようにこの単純な問題を見逃すことができる人、他の誰かの間違いを将来修正するでしょう!
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 -->
これは私にとってはうまくいきました。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
これで、/を詳しく見てみるために、 コマンド更新の代替方法の使い方
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>
Java 11およびgradleの私にとって、これがうまくいったものです:
plugins {
id 'Java'
}
dependencies {
runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}
これにより、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>