Java 9lang.NoClassDefFoundError nasıl çözülür: Java 9'da javax / xml / bind / JAXBException


845

Java 6/7/8 JDK bir parçası olarak sağlanan JAXB API sınıflarını kullanan bazı kod var. Java 9 ile aynı kodu çalıştırdığımda, çalışma zamanında JAXB sınıflarının bulunamadığını gösteren hatalar alıyorum.

JAXB sınıfları, Java 6'dan beri JDK'nın bir parçası olarak sağlanmıştır, bu yüzden Java 9 neden bu sınıfları bulamıyor?


2
Bu yanıtın ek kısmı , bu API'lerin taşınmasıyla ilgilidir.
Naman

7
Java 8 ile inşa etmek kodunuzu evet derlemek için alacaktır, ancak Java 9+ üzerinde bu derlenmiş kodu çalıştırmayı denediğinizde başarısız olacaktır çünkü JAX-B mevcut değildir.
Andy Guibert

1
Java 11 için bu makalenin çözümü günceldir: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext
Eric Wang

Yanıtlar:


1224

JAXB API'leri Java EE API'leri olarak kabul edilir ve bu nedenle artık Java SE 9'daki varsayılan sınıfyolunda yer almazlar. Java 11'de, bunlar JDK'dan tamamen kaldırılır.

Java 9, modül kavramlarını tanıtır ve varsayılan olarak, java.setoplu modül sınıfyolunda (veya daha doğrusu modül yolunda) bulunur. Adından da anlaşılacağı gibi, java.seagrega modül yok değil geleneksel Java 6/7/8 ile birlikte olan Java EE API içermekte.

Neyse ki, JDK 6/7/8 içinde sağlanan bu Java EE API'leri hala JDK'dadır, ancak varsayılan olarak sınıf yolunda değildir. Ek Java EE API'leri aşağıdaki modüllerde sağlanır:

java.activation
java.corba
java.transaction
java.xml.bind  << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation

Hızlı ve kirli çözüm: (yalnızca JDK 9/10)

JAXB API'lerini çalışma zamanında kullanılabilir hale getirmek için aşağıdaki komut satırı seçeneğini belirtin:

--add-modules java.xml.bind

Ama yine de Java 8 ile çalışmak için buna ihtiyacım var !!!

Daha --add-moduleseski bir JDK ile belirtmeyi denerseniz , tanınmayan bir seçenek olduğu için patlayacak. İki seçenekten birini öneririm:

  1. JDK_JAVA_OPTIONSOrtam değişkenini kullanarak yalnızca Java 9+ ve üstü seçeneklerini ayarlayabilirsiniz . Bu ortam değişkeni, Java 9+ için başlatıcı tarafından otomatik olarak okunurjava .
  2. -XX:+IgnoreUnrecognizedVMOptionsJVM'yi, havaya uçurmak yerine tanınmayan seçenekleri sessizce yok saymak için ekleyebilirsiniz . Ama dikkat et! Kullandığınız diğer komut satırı bağımsız değişkenleri artık sizin için JVM tarafından doğrulanmayacak. Bu seçenek, Oracle / OpenJDK ve IBM JDK (JDK 8sr4'ten itibaren) ile çalışır.

Alternatif hızlı çözüm: (yalnızca JDK 9/10)

--add-modules java.se.eeSeçeneği belirterek, yukarıdaki Java EE modüllerinin tümünü çalışma zamanında kullanabileceğinizi unutmayın . java.se.eeModül içeren bir toplam modülüdür java.se.eeyanı sıra yukarıda Java EE API modülleri. Not Bu Java 11 çalışmıyor çünkü java.se.eeJava 11'de çıkarıldı.


Uygun uzun vadeli çözüm: (JDK 9 ve üstü)

Yukarıda listelenen Java EE API modüllerinin tümü , Java 11'de kaldırılmak@Deprecated(forRemoval=true) üzere zamanlandıkları için işaretlenir . Dolayısıyla yaklaşım artık Java 11'de kullanıma hazır olmayacak.--add-module

Java 11 ve sonraki sürümlerinde yapmanız gereken şey, sınıf yolundaki veya modül yolundaki Java EE API'lerinin kendi kopyasını içermektir. Örneğin, JAX-B API'lerini aşağıdaki gibi bir Maven bağımlılığı olarak ekleyebilirsiniz:

<!-- 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 hakkında daha fazla bilgi için JAXB Başvuru Uygulaması sayfasına bakın.

Java modülerliği hakkında tüm ayrıntılar için, bkz. JEP 261: Modül Sistemi

Gradle veya Android Studio geliştiricisi için: (JDK 9 ve üstü)

build.gradleDosyanıza aşağıdaki bağımlılıkları ekleyin :

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 modülleri kullanımdan kaldırılmış olarak işaretlenmişse, Java 10'da JAXB'nin artık Java 10'da çalışma zamanında kullanılamayacağı anlamına mı geliyor? Bu geriye doğru bir adım gibi görünüyor. JAXB'yi bağımlılık olarak dahil etmek için 6 öncesi uygulamaya geri dönmemiz gerekecek.
Michael

4
Java EE ile Paylaşılan Modüller bölümündeki docs.oracle.com/javase/9/migrate buradaki taşıma kılavuzuna göre --add-modules java.se.ee veya --add modülleri ALL-SYSTEM'i geçici bir çözüm olarak kullanmanız önerilmez. Varsayılan -> nokta 1
justMe

6
Java 10 resmi olarak piyasaya sürüldüğünde, add-module yönteminin hala çalışacağını doğrulayabiliriz. javax.xml.bindVe diğer JavaEE sınıfları başına, Java 11'de çıkarılması planlanan Jep-320 .
Joep Weijers

10
Ve şimdi Java 11 yayınlandı ve java.se.eemodül kaldırıldı, böylece --add-modulesçözüm artık çalışmıyor. Bunun yerine önerilen çözümü kullanın: JAXB'yi ayrı bir bağımlılık olarak ekleyin.
Jesper

11
Bu bağımlılıkları ekledim ve hala bana aynı hatayı veriyor. neden herhangi bir fikir?
João Vieira

262

Benim durumumda (bahar çizme yağ kavanoz) ben sadece pom.xml için aşağıdaki ekleyin.

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


9
Bunun gibi gradle bağımlılığı eklemek testCompile('javax.xml.bind:jaxb-api')benim için çalıştı.
pamcevoy

5
@Pamcevoy'un belirttiği gibi, Spring Boot kullanırken jaxb-api sürümünü belirtmeye gerek yok. Boot, sürümü otomatik olarak yönetir.
Marcel Overdijk

2
<scope>runtime</scope>Böyle bir durum için kullanmanızı öneririm
VladS

5
@ Tuno'nun bağlantısı benim için çalışmadı, sabit bağlantı: github.com/spring-projects/spring-boot/wiki/…
Francisco Mateo

69

Bu çözümlerin hiçbiri son JDK 9.0.1'de benim için iyi sonuç vermedi.

Bu bağımlılıklar listesinin uygun bir işlev için yeterli olduğunu buldum, bu yüzden açıkça belirtmenize gerek yok--add-module (bu bağımlılıkların pom'larında belirtilmiş olsa da). İhtiyacınız olan tek şey bu bağımlılıklar listesini belirtmektir:

<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 için, jaxb-core ve jaxb-impl'ü yukarıdan çıkarın.
foo

3
@Bu pom.xml, Maven yapılandırmasının bir dosyası. Bunun ne olduğunu bilmiyorsanız, başlangıçtan başlamak daha iyidir
Andremoniy

8
Geçersiz bir yansıtıcı erişim işlemi oluştu UYARI: com.sun.xml.bind.v2.runtime.reflect.opt.Injector (dosya: / 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) yöntemine UYARI: Lütfen dikkate alın bunu com.sun.xml.bind.v2.runtime.reflect.opt.Intector uygulamasının sahiplerine bildirme UYARI: --illegal-access = komutunu kullanarak, diğer yasadışı yansıtıcı erişim işlemlerine ilişkin uyarıları etkinleştirin Uyarı: gelecekteki bir sürümde reddedildi
Stefan

1
Bu benim için JDK 9.0.4 üzerinde çalıştı (Maven 3.5.3 ile bir Maven eklentisi aracılığıyla JAXB ile ilgili kodu çağırıyordum). Her ne <dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>kadar son bağımlılık olarak kullansam da.
scrutari

1
Muhteşem. Bir sebepten ötürü - bir bahar önyükleme uygulamasının intellij CE'de çalıştığı ancak mac'ta tutulma ve tutulmada ancak win10'da intellij CE'nin çalışmadığı bir durum vardı. Bir IDE'de iki platformda çalışabilmek bir avantajdır.
kometen

42

Bu benim için çalıştı:

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

Güncelleme

@Jasper'in önerdiği gibi, tüm EclipseLink kitaplığına bağlı kalmamak için EclipseLink MOXy'ye de güvenebilirsiniz:

Uzman

<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 uygulamam için bağımlılık olarak, hem JRE 8 hem de JRE 9 tarafından ek argüman olmadan çalıştırılabilen * .jar üretir.

Ayrıca, JAXB API'sı kullanılmadan önce bunun bir yerde yürütülmesi gerekir:

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

Bir çözüm olarak şimdiye kadar harika çalışıyor. Mükemmel bir çözüm gibi görünmüyor ...


5
org.eclipse.persistence:eclipselinkzaten eclipselink kullanmıyorsanız, sadece JAXB API'leri almak için eklemek çok ağır bir bağımlılıktır?
Andy Guibert

4
Evet ağır (~ 9mb) ve evet bunu zaten kullanıyorum. Bunun sadece geçici olarak, komut satırı argümanları sağlamadan aynı kavanoz / savaş için hem 8 hem de 9 JRE kullanmak zorunda kalacaklar için alternatif bir çözüm olduğunu belirttim.
Mikhail Kholodkov

2
JDK 8 ve 9 arasındaki birlikte çalışma uğruna, -XX:+IgnoreUnrecognizedVMOptionskomut satırı seçeneğini kullanmanızı öneririm (cevabımı ayrıntılarla güncelledi)
Andy Guibert 27:17

System.setProperty ("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); benim için çalışmıyor
David Brossard

1
Tüm EclipseLink kitaplığına bağlı kalmaktan kaçınmak için org.eclipse.persistence, EclipseLink MOXy: groupId , artifactId öğesine de güvenebilirsiniz org.eclipse.persistence.moxy.
Jesper

36

tüm JDK'lar için temiz çözüm> = 9

Derlemenize iki bağımlılık eklemeniz gerekir

  • jaxb-api
  • jaxb uygulaması

Bir uygulama olarak eski com.sun sınıflarından / kütüphanelerinden kurtulmak için glassfish tarafından referans uygulamasını kullanmayı seçtim. Sonuç olarak maven yapımda

<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 sürümünden itibaren javax.activation'ı artık eklemenize gerek olmadığını unutmayın. (bkz. https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )


Javax.xml.bind modülü gerçekten gerekli mi? JDK 11'deki kodum onsuz çalışıyor.
k.liakos

@ k.liakos Emin değilim. Jaxb-runtime jar ve api-jar aynı sınıfları / paketleri paylaşmaz. Sanırım koduna bağlı. Kodunuz 'javax.xml.bind' paketindeki sınıfları kullanmıyorsa, büyük olasılıkla buna ihtiyacınız yoktur. Bu iş parçacığının konusu 'javax / xml / bind / JAXBException' bulunamamasıdır; bu sınıf sadece jaxb-api'de.
Sebastian Thees

1
Java 12'deki çoklu modül projesi ile mükemmel çalışır.
Heril Muratovic

35

jkk 9 veya sonraki bir sürümünü kullanıyorsanız java sürümü sadece bunu pom'a ekleyin çünkü

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

1
Spring Boot rehberleriyle her zaman bununla karşılaşıyorum ... Bir ton teşekkürler.
masterxilo

2
@Cesar Rodriguez T, bunu havalı bir örnekle denedim ve derleme çalıştı ama koşmak hata verdi. Daha fazla bağımlılık içeren seçilmiş cevabı kullandım ve işe yaradı.
PatS

Projenizin pom.xml dosyasında
Cesar Rodriguez T

22

Bunu çözmek için, projeme bazı JAR dosyaları aktardım:

  • 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 çekirdekli 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. Yukarıdaki dosyaları indirin ve projedeki libs klasörüne kopyalayın
  2. İçe aktarılan JAR dosyalarını Java Derleme Yoluna ekleme

4
com.sun.xml.bindArtefaktların eski olduğunu ve yalnızca geriye dönük uyumluluk için sağlandığını unutmayın . Bunun org.glassfish.jaxbyerine, diğer cevapların bazılarında belirtildiği gibi eşdeğer eserler kullanmalısınız.
Jesper

Bu benim için işe yaramadı. Bir hata attı ve belirli bir sınıf bulamadığını söyledi.
RamenChef

Grails 3.4.10 uygulamasını dağıtırken Mint 19.2 (Ubuntu 18.04 base) altında tomcat9 / lib klasörüne koyduğumda benim için çalıştı.
Mohamad Fakih

18

Derleme sırasında ve çalışma zamanında, anahtarı ekleyin --add-modules java.xml.bind

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

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

JDK 9Modüllerin iyi bir tanıtımını şu adreste de bulabilirsiniz: https://www.youtube.com/watch?v=KZfbRuvv5qc


11

Bu benim için çalıştı. Sadece jaxb-api eklemek yeterli değildi.

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

Ve jaxb-api.version neye ayarlandı?
MiguelMunoz

@MiguelMunoz 2.2.7 kullandım
Bay Jedi

2
com.sun.xml.bindArtefaktların eski olduğunu ve yalnızca geriye dönük uyumluluk için sağlandığını unutmayın . Bunun org.glassfish.jaxbyerine, diğer cevapların bazılarında belirtildiği gibi eşdeğer eserler kullanmalısınız.
Jesper

11

Build.gradle'a gidin ve hem Java 9 hem de Java 10 için aşağıdaki bağımlılıkları ekleyin.

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

Kullanabilirsiniz --add-modules=java.xml.bindJVM çalışma zamanı ortamına xml bind modülü eklemek JVM seçeneğini .

Örneğin: java --add-modules=java.xml.bind XmlTestClass


11

Nisan 2019 Güncellemesi

JAXB sürümleri için changelong https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html adresinde

alıntılar:

    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

Yetkili bağlantı https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts adresinde

JAXB eserleri için maven koordinatları

jakarta.xml.bind: jakarta.xml.bind-api: JAXB için API sınıfları. JAXB'ye karşı derlemek için gereklidir.

org.glassfish.jaxb: jaxb-runtime: JAXB'nin uygulanması, java nesnelerinin serileştirilmesi ve serileştirilmesi için kullanılan java nesnelerini xml'ye / den.

JAXB yağ kavanoz demetleri:

com.sun.xml.bind: jaxb-impl: JAXB çalışma zamanı yağ kavanozu.

Org.glassfish.jaxb eserlerinin aksine, bu kavanozların içinde bulunan tüm bağımlılık sınıfları vardır. Bu eserler JPMS modülü tanımlayıcıları içermez. Maven projelerinde org.glassfish.jaxb eserlerinin kullanılması gerekiyor.

org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 içeri çeker:

[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

Orijinal Yanıt

Aşağıdaki Maven projemde JAXB RI için hangi eserleri kullanmalıyım? Maven'de şöyle bir profil kullanabilirsiniz:

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

Bağımlılık ağacı şunu gösterir:

[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'de bunu kullanmak için Oxygen.3a Release (4.7.3a) veya daha yenisini, Ctrl-Alt-P deyin ya da Maven projesine sağ tıklayın, ardından profili seçin.


Bir bağımlılık olduğunu göstermek için teşekkürler javax.xml.bind> jaxb-apibaşka yerde gördük aslında gereksiz olduğunu. Glassfish bağımlılığı çekiyor. Sadece denedim ve gerçekten işe yarıyor.
Basil Bourque


8

pom.xml'de javax.xml.bind bağımlılığını ekleyin

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

8

JavaEE artık https://jakarta.ee/ tarafından yönetildiğinden , 2.3.2'deki yeni Maven koordinatları:

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

İlk serbest bırakılan jaxb.version 2.3.2'dir.

<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

Bu URL'yi izledim ve aşağıdaki ayarlar gerçekten bana yardımcı oldu. Macbook Pro'da Java 10'u STS IDE ile kullanıyorum. Mucizevi şekilde çalışır.

   <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

Bu, Java 12'de Apache Camel 2.24.1 çalıştıran bağımlılıklarla ilgili sorunlarımı çözdü:

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

benim durumumda pom dosyasında tomcat bağımlılığı eklemek gerekiyor
GvSharma

6

2.0.5.RELEASEJava 11'de Spring Boot'u kullanırken de aynı sorunla karşılaştım .

javax.xml.bind:jaxb-api:2.3.0Tek başına eklemek sorunu çözmedi. Ayrıca Spring Boot'u en son Milestone'a güncellemem gerekti 2.1.0.M2, bu yüzden bunun bir sonraki resmi sürümde düzeltileceğini varsayıyorum.


Bu benimle ilgili değil. bu iş parçacığında yaylı önyükleme 2 kullanılmasına bakılmaksızın çalışan birkaç çözüm vardır. Belki Bahar 2.1.0.M2'de zaten bir jaxb çalışma zamanı var.
Sebastian Thees

Artık Bahar Boot 2.1.0.RELEASE ile JAXB gerekli olmadığını görünüyor - github.com/spring-projects/spring-boot/releases
Burrich

5

JDK 9+ kullanırken JAX-B bağımlılıkları eklemeniz gerekir. Android Studio kullanıcı için, size bu eklemeniz gerekir build.gradle'ın dependencies {}bloğun:

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

Birim testleri için çalışmıyor
Malachiasz

Ünite testleri ile çalışmak için cevabınızı değiştirdim.
Malachiasz

4

Ayrıca ClassNotFoundException genelinde stumpled: javax.xml.bind.DatatypeConverter kullanarak Java 11 ve

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

Ben javax.xml.bind: jaxb-api veya bahar çizme jakarta.xml.bind-api ekleyerek etrafında tüm bu şeyleri denedim .. jjwt sürüm 0.10.0 düzeltmeleri için bir ipucu buldum .. ama daha da önemlisi, jjwt paketi şimdi bölün!

Bu nedenle, bu referansı kontrol edin: https://github.com/jwtk/jjwt/issues/510

Basitçe, kullanırsanız

Java11 ve jjwt 0.9.x ve ClassNotFoundException ile karşılaşırsınız: javax.xml.bind.DatatypeConverter sorunu,

için git

jjwt sürüm 0.11.x, ancak bölünmüş paketleri kullanın: https://github.com/jwtk/jjwt#install

Paketleri böltüklerinden, jjwt bağımlılığı için daha yüksek bir sürüm bulamazsınız.

Şerefe.


3

Bir cevap değil, bir groovyshzeyil: JAVA_HOME ( java version "9.0.1"kesin olarak) bir Java 9 kurulumuna işaret ediyorsa (Groovy 2.4.13) çalışmanın uçurumdan başarısız olması nedeniyle aldım :

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

Çözüm:

  • Git JAXB Projesi github.io de ( "- Sınıf-yolu hariç olmak üzere CDDL 1.1 ve GPL 2.0 JAXB ikili lisans ile korunmaktadır" )

  • İndir jaxb-ri-2.3.0.zip

  • Java altyapı dosyalarınızı nereye koyarsanız açın (benim durumumda /usr/local/java/jaxb-ri/). Başka bir çözüm olabilir (belki SDKMAN aracılığıyla, bilmiyorum)

  • Lib alt dizinindeki kavanozların üzerinde olduğundan emin olun CLASSPATH. Ben /etc/profile.d/java.sh(diğer birçok satır arasında) aşağıdaki döngü ekledi denilen , bash başlangıçta başlayan bir komut dosyası ile yapmak :

Bir fonksiyonda paketlenmiştir ...

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

Ve çalışıyor!


1
Downvotzları anlamıyorum. Görünüşe göre insanlar aslında kavanozları almak yerine komut satırı seçenekleriyle dolaşmak istiyorlar mı? Kendine uygun.
David Tonhofer

7
Java geliştiricileri genellikle kavanozları manuel olarak indirmek yerine bağımlılıkları yönetmek için Gradle veya Maven gibi derleme araçlarını kullanır. Muhtemelen aşağı oyların nedeni budur.
Joshua Davis

3

Sadece 1 bağımlılığa ihtiyacınız var:

dependencies {
    implementation ("jakarta.xml.bind:jakarta.xml.bind-api:2.3.2")


2

Eski cevap "Amazoncorretto'ya geçerek sorun çözüldü" Haber cevabı: En son corretto kullandım ama benzer jdk 1.8. zaten bağımlılıkları manuel olarak eklememiz gerekiyor


2
JDK 11 için Amazon Corretto dağıtımı javax.xml.bind sınıfları sağlamaz. Correto'ya geçtikten sonra sorun çözüldüyse, bunun nedeni JDK 8'e indirgenmiş olmanızdı.
Andy Guibert

garip, kontrol edeceğim, docker en son koretoloji kullandım
Armen Arzumanyan

Evet, amazoncorretto:latestşu anda 11 değil JDK 8 veriyor. Birçok Docker görüntüsü, JDK 8 -> 11
Andy Guibert

2

Java 8 hedefi için derlerken kullanmam gereken bağımlılık sürümleri. Java 8, 11 ve 12 JRE'lerde test edilmiş uygulama.

        <!-- 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 ve gradle benim için işe yarayan budur:

plugins {
      id 'java'
}

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

tam olarak nereye koyduk?
nyxee

Gradle kullanıyorsanız build.gradle dosyanızda.
silver_mx

1

Maav'a jaxb bağımlılıkları eklemeniz gerekir. Glassfish uygulama sürümü 2.3.2, yeni jakarta EE jaxb api sürüm 2.3.2 ile mükemmel uyumludur.

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

i java 11 projemi yükselttikten sonra benzer sorunlar vardı, o zaman ne o görünüşte java 11 desteği vardır yay çizme 2.1.1 için yükseltme oldu sabit bu yardım


ileride URL değişecekse yalnızca bağlantı yanıtları geçersiz olacağından lütfen yanıtınıza çözümün en azından bir kısmını eklemeyi düşünün.
yukashima huksay

0

Partiye geç kaldığımı biliyorum, ama hatam farklı bir çözüme ihtiyaç duydu ... çok basit

Başlangıçta Tomcat 9'a depoloyed ve 7'ye ihtiyacım olduğunu fark ettim ... Sınıf yolumu build.xml dosyasındaki 7 sürümüyle eşleştirmeyi unuttum

Umarım bu, benim gibi bu basit sorunu göz ardı etmeyi başarabilen, gelecekte başkalarının hatasını düzeltir!


2
Bu
OP'ye

0

jaxws-maven-pluginSadece bu bağımlılığı ekleyerek SOAP web hizmetlerini (örneğin kullanarak ) arıyorsanız, tüm JAXB hataları kaybolur:

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

Java 13 ile test edilmiştir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.