วิธีแก้ไข java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException ใน Java 9


845

ฉันมีรหัสบางส่วนที่ใช้คลาส JAXB API ซึ่งได้รับการจัดให้เป็นส่วนหนึ่งของ JDK ใน Java 6/7/8 เมื่อฉันเรียกใช้รหัสเดียวกันกับ Java 9 ที่รันไทม์ฉันได้รับข้อผิดพลาดที่ระบุว่าไม่พบคลาส JAXB

คลาส JAXB ได้รับการจัดให้เป็นส่วนหนึ่งของ JDK ตั้งแต่ Java 6 ดังนั้นทำไม Java 9 จึงไม่พบคลาสเหล่านี้อีกต่อไป


2
ส่วนเพิ่มเติมในคำตอบนี้เกี่ยวข้องกับการโยกย้ายของ API เหล่านี้
Naman

7
การสร้างด้วย Java 8 จะได้รับโค้ดของคุณเพื่อคอมไพล์ใช่ แต่เมื่อคุณพยายามรันโค้ดที่คอมไพล์บน Java 9+ มันจะล้มเหลวเนื่องจาก JAX-B ไม่มีอยู่
Andy Guibert

1
สำหรับ Java 11 โซลูชันของบทความนี้เป็นรุ่นล่าสุด: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext
Eric Wang

คำตอบ:


1224

JAXB API นั้นถือว่าเป็น Java EE API ดังนั้นจึงไม่มีอยู่ใน classpath เริ่มต้นใน Java SE 9 ใน Java 11 พวกเขาจะถูกลบออกจาก JDK อย่างสมบูรณ์

Java 9 แนะนำแนวคิดของโมดูลและโดยปกติแล้วjava.seโมดูลรวมจะมีอยู่ใน classpath (หรือมากกว่านั้นคือโมดูลพา ธ ) ตามที่มีความหมายชื่อjava.seโมดูลรวมจะไม่รวม Java EE APIs ที่รวมอยู่กับ Java 6/7/8 ตามธรรมเนียมแล้ว

โชคดีที่ Java EE APIs เหล่านี้ที่ให้ไว้ใน JDK 6/7/8 ยังคงอยู่ใน JDK แต่จะไม่อยู่ใน classpath โดยปริยาย Java EE APIs เพิ่มเติมมีให้ในโมดูลต่อไปนี้:

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 รุ่นเก่ามันจะระเบิดเพราะเป็นตัวเลือกที่ไม่รู้จัก ฉันแนะนำหนึ่งในสองตัวเลือก:

  1. คุณสามารถตั้งค่าตัวเลือก Java 9+ เท่านั้นโดยใช้JDK_JAVA_OPTIONSตัวแปรสภาพแวดล้อม ตัวแปรสภาวะแวดล้อมนี้ถูกอ่านโดยjavaตัวเรียกใช้งานอัตโนมัติสำหรับ Java 9+
  2. คุณสามารถเพิ่มการ-XX:+IgnoreUnrecognizedVMOptionsทำให้ JVM ไม่สนใจตัวเลือกที่ไม่รู้จักอย่างเงียบ ๆ แทนที่จะทำให้ตกใจ แต่ระวัง! อาร์กิวเมนต์บรรทัดคำสั่งอื่น ๆ ที่คุณใช้จะไม่ได้รับการตรวจสอบสำหรับคุณโดย JVM ตัวเลือกนี้ทำงานร่วมกับ Oracle / OpenJDK เช่นเดียวกับ IBM JDK (ตั้งแต่ JDK 8sr4)

ทางเลือกแก้ปัญหาด่วน: (JDK 9/10 เท่านั้น)

โปรดทราบว่าคุณสามารถทำให้โมดูล Java EE ข้างต้นทั้งหมดพร้อมใช้งานในขณะใช้งานโดยระบุ--add-modules java.se.eeตัวเลือก java.se.eeโมดูลโมดูลรวมที่มีjava.se.eeเช่นเดียวกับด้านบน Java EE โมดูล API หมายเหตุสิ่งนี้ใช้ไม่ได้กับ Java 11เพราะjava.se.eeถูกลบใน Java 11


วิธีแก้ปัญหาระยะยาวที่เหมาะสม: (JDK 9 ขึ้นไป)

โมดูล API Java EE กล่าวข้างต้นมีการทำเครื่องหมายทั้งหมด@Deprecated(forRemoval=true)เพราะพวกเขาจะกำหนดไว้สำหรับการกำจัดในJava 11 ดังนั้น--add-moduleวิธีการนี้จะไม่ทำงานใน Java 11 อีกต่อไป

สิ่งที่คุณจะต้องทำใน Java 11 และส่งต่อคือรวมสำเนา Java EE APIs ของคุณเองบน classpath หรือโมดูลพา ธ ตัวอย่างเช่นคุณสามารถเพิ่ม JAX-B APIs เป็นการพึ่งพา 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: ระบบโมดูล

สำหรับผู้พัฒนา 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 อีกต่อไป? ดูเหมือนว่าจะถอยหลังไปหนึ่งก้าว เราจะต้องกลับไปฝึกหัดก่อน -6 ของการรวม JAXB เป็นการพึ่งพา
ไมเคิล

4
การใช้ --add-modules java.se.ee หรือ --add-modules ALL-SYSTEM เป็นวิธีแก้ปัญหาไม่แนะนำตามคู่มือการโยกย้ายที่นี่docs.oracle.com/javase/9/migrate ภายใต้ส่วนโมดูลที่ใช้ร่วมกับ Java EE ไม่ แก้ไขโดยค่าเริ่มต้น -> จุด 1
justMe

6
ด้วยการเปิดตัว Java 10 อย่างเป็นทางการเราสามารถยืนยันได้ว่าวิธีการเพิ่มโมดูลจะยังคงทำงานได้ javax.xml.bindและการเรียน JavaEE อื่น ๆ ที่กำหนดไว้สำหรับการกำจัดในชวา 11 ต่อJEP-320
Joep Weijers

10
และตอนนี้ Java 11 ถูกปล่อยออกมาและjava.se.eeโมดูลได้ถูกลบออกดังนั้นการ--add-modulesแก้ปัญหาไม่ทำงานอีกต่อไป ใช้โซลูชันที่แนะนำแทน: เพิ่ม JAXB เป็นการพึ่งพาแยกต่างหาก
Jesper

11
ฉันได้เพิ่มการขึ้นต่อกันเหล่านี้แล้วและมันยังทำให้ฉันมีข้อผิดพลาดเหมือนเดิม ความคิดใด ๆ
João Vieira

262

ในกรณีของฉัน (สปริงบูตไขมันขวด) ฉันเพิ่งเพิ่มต่อไปนี้เพื่อ pom.xml

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

10
เพียงสำหรับการอ้างอิงgithub.com/spring-projects/spring-boot/wiki/ …
Tuno

9
การเพิ่มการพึ่งพา gradle เช่นนี้testCompile('javax.xml.bind:jaxb-api')ทำงานให้ฉัน
pamcevoy

5
เช่นเดียวกับ @pamcevoy ที่กล่าวถึงไม่จำเป็นต้องระบุเวอร์ชันของ jaxb-api เมื่อใช้ Spring Boot บูตจัดการเวอร์ชันโดยอัตโนมัติ
Marcel Overdijk

2
ฉันขอแนะนำให้ใช้<scope>runtime</scope>สำหรับกรณีดังกล่าว
VladS

5
ลิงก์ของ @ Tuno ไม่ทำงานสำหรับฉันลิงก์ถาวรคือ: github.com/spring-projects/spring-boot/wiki/…
Francisco Mateo

69

ไม่มีวิธีแก้ไขปัญหาเหล่านี้ทำงานได้ดีสำหรับฉันใน JDK 9.0.1 ล่าสุด

ฉันพบว่ารายการการพึ่งพานี้เพียงพอสำหรับการทำงานที่เหมาะสมดังนั้นคุณไม่จำเป็นต้องระบุอย่างชัดเจน--add-module(แม้ว่าจะระบุไว้ใน pom's การพึ่งพาเหล่านี้) สิ่งเดียวที่คุณต้องการคือการระบุรายการการพึ่งพา:

<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
@Ailil นี่เป็นpom.xmlไฟล์การกำหนดค่า Maven หากคุณไม่รู้ว่ามันคืออะไรมันจะเป็นการดีกว่าถ้าคุณเริ่มต้นจากการ
ขอทาน

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, ไบต์ [], int, int) คำเตือน: โปรดพิจารณา การรายงานสิ่งนี้กับผู้ดูแลระบบของ com.sun.xml.bind.v2.runtime.reflect.opt.Injector คำเตือน: ใช้ --illegal-access = warn เพื่อเปิดใช้งานคำเตือนของการดำเนินการเข้าถึงการสะท้อนกลับที่ผิดกฎหมายคำเตือน: การดำเนินการเข้าถึงที่ผิดกฎหมายทั้งหมดจะเป็น ปฏิเสธในการเปิดตัวในอนาคต
Stefan

1
สิ่งนี้ใช้ได้กับฉันใน JDK 9.0.4 (ฉันเรียกรหัสที่เกี่ยวข้องกับ JAXB ผ่านปลั๊กอิน Maven ที่มี Maven 3.5.3) แม้ว่าฉันจะใช้<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>เป็นการพึ่งพาครั้งสุดท้าย
scrutari

1
น่ากลัว ฉันมีสถานการณ์ที่ - ด้วยเหตุผลบางอย่าง - สปริงบู๊ทแอพจะทำงานใน Intellij CE แต่ไม่ใช่ eclipse บน mac และใน eclipse แต่ไม่ใช่ intellij CE ใน win10 ความสามารถในการทำงานในหนึ่ง 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:

Maven

<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 ของฉันซึ่งสร้าง * .jar ซึ่งสามารถรันได้ทั้ง JRE 8 หรือ JRE 9 โดยไม่มีข้อโต้แย้งเพิ่มเติม

นอกจากนี้ต้องดำเนินการบางอย่างก่อนที่จะใช้ JAXB API:

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

ใช้งานได้ดีจนถึงขณะนี้เป็นวิธีแก้ปัญหา ดูเหมือนจะเป็นโซลูชั่นที่สมบูรณ์แบบ แต่ ...


5
การเพิ่มorg.eclipse.persistence:eclipselinkเพียงเพื่อให้ได้ JAXB APIs นั้นเป็นสิ่งที่ต้องพึ่งพาอย่างหนักหากคุณไม่ได้ใช้ eclipselink อยู่แล้ว
Andy Guibert

4
ใช่มันหนัก (~ 9mb) และใช่ฉันใช้มันไปแล้ว ฉันได้กล่าวว่านี่เป็นเพียงวิธีแก้ปัญหาทางเลือกสำหรับผู้ที่อาจจะชั่วคราวต้องใช้ทั้ง 8 และ 9 JREs สำหรับ jar / war เดียวกันโดยไม่ต้องระบุอาร์กิวเมนต์บรรทัดคำสั่ง
Mikhail Kholodkov

2
เพื่อประโยชน์ในการทำงานร่วมกันระหว่าง JDK 8 และ 9 ฉันขอแนะนำให้ใช้-XX:+IgnoreUnrecognizedVMOptionsตัวเลือกบรรทัดคำสั่ง (อัปเดตคำตอบของฉันพร้อมรายละเอียด)
Andy Guibert

System.setProperty ("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); ไม่ทำงานสำหรับฉัน
David Brossard

1
เพื่อหลีกเลี่ยงการขึ้นอยู่กับห้องสมุด EclipseLink ทั้งคุณยังสามารถเพียงขึ้นอยู่กับ EclipseLink Moxy: groupID org.eclipse.persistence, org.eclipse.persistence.moxyartifactId
Jesper

36

วิธีแก้ปัญหาใหม่ทั้งหมดสำหรับ JDKs ทั้งหมด> = 9

คุณต้องเพิ่มการขึ้นต่อกันสองครั้งในงานสร้างของคุณ

  • jaxb-api
  • การใช้ jaxb

เป็นการดำเนินการฉันเลือกใช้การอ้างอิงโดย glassfish เพื่อกำจัด 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 อีกต่อไป (ดู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
เซบาสเตียน Thees

1
ทำงานได้อย่างสมบูรณ์แบบกับโครงการหลายโมดูลในจาวา 12
Heril Muratovic

35

เป็นเพราะรุ่นจาวาถ้าคุณใช้ jdk 9 หรือรุ่นที่ใหม่กว่าเพียงแค่เพิ่มลงใน pom ของคุณ

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

1
ฉันพบปัญหานี้ตลอดเวลาด้วยคำแนะนำของ Spring Boot ... ขอบคุณมาก
masterxilo

2
@ Cesar Rodriguez T ฉันลองมันด้วยตัวอย่างที่คล่องแคล่วและคอมไพล์ทำงานได้ ฉันใช้คำตอบที่เลือกซึ่งรวมถึงการพึ่งพามากขึ้นและได้ผล
PatS

ในไฟล์ 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 Build Path

4
โปรดทราบว่าcom.sun.xml.bindสิ่งประดิษฐ์เก่าและมีไว้สำหรับความเข้ากันได้แบบย้อนหลังเท่านั้น คุณควรใช้org.glassfish.jaxbสิ่งประดิษฐ์ที่เทียบเท่าแทนดังที่กล่าวไว้ในคำตอบอื่น ๆ
Jesper

สิ่งนี้ไม่ได้ผลสำหรับฉัน เกิดข้อผิดพลาดและบอกว่าไม่สามารถหาชั้นเรียนพิเศษได้
RamenChef

ทำงานสำหรับฉันเมื่อฉันวางไว้ในโฟลเดอร์ tomcat9 / lib ภายใต้ Mint 19.2 (ฐาน Ubuntu 18.04) เมื่อใช้งานแอปพลิเคชัน Grails 3.4.10
Mohamad Fakih

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


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

2
โปรดทราบว่าcom.sun.xml.bindสิ่งประดิษฐ์เก่าและมีไว้สำหรับความเข้ากันได้แบบย้อนหลังเท่านั้น คุณควรใช้org.glassfish.jaxbสิ่งประดิษฐ์ที่เทียบเท่าแทนดังที่กล่าวไว้ในคำตอบอื่น ๆ
Jesper

11

ไปที่ 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.bindตัวเลือก JVM เพื่อเพิ่มโมดูล xml bind ให้กับสภาพแวดล้อมรันไทม์ของ JVM

เช่น: java --add-modules=java.xml.bind XmlTestClass


11

อัปเดตเมษายน 2019

การเปลี่ยนแปลงตลอดเวลาสำหรับการเผยแพร่ JAXB อยู่ที่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

Maven พิกัดสำหรับสิ่งประดิษฐ์ JAXB

jakarta.xml.bind: jakarta.xml.bind-api: API คลาสสำหรับ JAXB จำเป็นต้องรวบรวมกับ JAXB

org.glassfish.jaxb: jaxb-runtime: การใช้งาน JAXB, รันไทม์ที่ใช้สำหรับการทำให้เป็นอันดับและออบเจ็กต์ deserialization java ไปยัง / จาก xml

ชุดรวมขวดไขมัน JAXB:

com.sun.xml.bind: jaxb-impl: jar ไขมัน JAXB รันไทม์

ตรงกันข้ามกับ org.glassfish.jaxb jars เหล่านี้มีคลาสการพึ่งพาทั้งหมดที่รวมอยู่ภายใน ส่วนเหล่านี้ไม่มีตัวอธิบายโมดูล 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

คำตอบเดิม

การติดตามสิ่งประดิษฐ์ใดที่ฉันควรใช้สำหรับ JAXB RI ในโครงการ Maven ของฉัน ใน 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 จากนั้นเลือกโปรไฟล์


ขอบคุณที่แสดงให้เห็นว่าการพึ่งพาjavax.xml.bind> jaxb-apiที่ฉันได้เห็นจากที่อื่นเป็นเรื่องซ้ำซ้อน การพึ่งพา glassfish ดึงมันเป็น ฉันแค่ลองมันแล้วมันใช้งานได้จริง
Basil Bourque

8

สำหรับ Java Web Start Execution เราสามารถใช้คำแนะนำของ Andy Guibert ดังนี้:

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

หมายเหตุพิเศษ "=" ใน - เพิ่มโมดูล ดูนี้ตั๋ว OpenJDKหรือบันทึกล่าสุดใน "การทำความเข้าใจคำเตือนรันไทม์การเข้าถึง" ของแพลตฟอร์ม Java, Standard Edition ของออราเคิล JDK 9 คู่มือการย้าย


8

เพิ่มการพึ่งพา javax.xml.bind ใน pom.xml

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

8

เนื่องจาก JavaEE อยู่ภายใต้การควบคุมของhttps://jakarta.ee/พิกัด Maven ใหม่ ณ 2.3.2 จึงเป็น:

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 นี้และการตั้งค่าด้านล่างช่วยฉันได้จริงๆ ฉันใช้ Java 10 กับ STS IDE ใน Macbook Pro มันทำงานเหมือนจับใจ

   <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

วิธีนี้ช่วยแก้ไขปัญหาของฉันเกี่ยวกับการใช้งาน Apache Camel 2.24.1 บน Java 12:

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

ในกรณีของฉันฉันจำเป็นต้องเพิ่มการอ้างอิง Tomcat ในไฟล์ pom
34415

6

ฉันพบปัญหาเดียวกันโดยใช้ Spring Boot 2.0.5.RELEASEบน Java 11

การเพิ่มjavax.xml.bind:jaxb-api:2.3.0เพียงอย่างเดียวไม่สามารถแก้ไขปัญหาได้ ฉันต้องอัปเดต Spring Boot เป็น Milestone ล่าสุด2.1.0.M2ดังนั้นฉันคิดว่านี่จะได้รับการแก้ไขในการเปิดตัวอย่างเป็นทางการครั้งต่อไป


สิ่งนี้ไม่เกี่ยวข้องกับเสียงของฉัน มีวิธีแก้ปัญหาหลายอย่างในเธรดนี้ที่ทำงานโดยไม่คำนึงถึงการใช้สปริงบูต 2 (ฉันใช้สปริงบูท 2.0.5.RELEASE btw) บางทีใน Spring 2.1.0.M2 มี jaxb runtime รวมอยู่ด้วย
เซบาสเตียน Thees

ดูเหมือนว่าด้วย Spring Boot 2.1.0.RELEASE, JAXB ไม่จำเป็นอีกต่อไป - github.com/spring-projects/spring-boot/releases
Burrich

5

คุณต้องเพิ่มการพึ่งพา JAX-B เมื่อใช้ JDK 9+ สำหรับผู้ใช้ Android Studio คุณจะต้องเพิ่มนี้เพื่อคุณbuild.gradle's dependencies {}บล็อก:

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

ฉันยังย้ำถึง ClassNotFoundException: javax.xml.bind.DatatypeConverter โดยใช้Java 11และ

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

ฉันลองทุกสิ่งนี้เกี่ยวกับการเพิ่ม javax.xml.bind: jaxb-api หรือ spring boot 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

ไม่ใช่คำตอบ แต่เป็นภาคผนวก: ฉันได้รับเนื่องจากการเรียกใช้groovysh(Groovy 2.4.13) ถ้า JAVA_HOME ชี้ไปที่การติดตั้ง Java 9 ( java version "9.0.1"เพื่อความแม่นยำ) จะล้มเหลวแบบ abysmally:

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

  • แตกไฟล์ที่คุณใส่ไฟล์โครงสร้างพื้นฐานจาวาของคุณ (ในกรณีของฉัน/usr/local/java/jaxb-ri/) อาจมีวิธีแก้ไขปัญหาอื่น (อาจผ่าน SDKMAN ฉันไม่ได้)

  • ตรวจสอบให้แน่ใจขวดในไดเรกทอรีย่อย lib CLASSPATHที่อยู่บน ฉันทำผ่านสคริปต์เริ่มต้นเมื่อ bash startup เรียกว่า/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
ฉันไม่เข้าใจ downvotzes เห็นได้ชัดว่าผู้คนต้องการที่จะดื่มด่ำกับตัวเลือกบรรทัดคำสั่งแทนที่จะได้ขวดมา เหมาะกับตัวเอง
David Tonhofer

7
นักพัฒนา Java มักจะใช้เครื่องมือสร้างเช่น Gradle หรือ Maven เพื่อจัดการการพึ่งพามากกว่าการดาวน์โหลด jars ด้วยตนเอง นั่นอาจเป็นเหตุผลสำหรับการลงคะแนนเสียง
Joshua Davis


2

ตกลงฉันได้รับปัญหาชนิดเดียวกัน แต่ฉันใช้ Java 8 และได้รับข้อผิดพลาดนี้ฉันพยายามแก้ปัญหาส่วนใหญ่ แต่ปรากฎว่า maven ของฉันยังคงชี้ไปที่ java 9 แม้ว่าฉันจะตั้งค่าเวอร์ชัน Java ทั่วโลกเป็น 8 ทันทีที่ฉันแก้ไขว่ามันทำงานได้ทั้งหมด

สำหรับใครก็ตามที่อาจมีปัญหาแบบนี้ลองดูวิธีแก้ไข Maven ให้ใช้จาวาเริ่มต้น


2

คำตอบเก่า "แก้ไขปัญหาโดยเปลี่ยนเป็น amazoncorretto" คำตอบข่าว: ฉันใช้ Corretto ล่าสุด แต่คล้าย jdk 1.8 ดังนั้นเราต้องเพิ่มการอ้างอิงด้วยตนเอง


2
การแจกจ่าย Amazon Corretto สำหรับ JDK 11 ไม่ได้จัดเตรียมคลาส javax.xml.bind หากปัญหาได้รับการแก้ไขหลังจากเปลี่ยนเป็น Correto นั่นเป็นเพราะคุณลดระดับเป็น JDK 8
Andy Guibert

แปลกฉันจะตรวจสอบในนักเทียบท่าที่ฉันใช้ Correto ล่าสุด
Armen Arzumanyan

ใช่แล้วamazoncorretto:latestปัจจุบันให้ JDK 8 ไม่ใช่ 11 ภาพ Docker จำนวนมากยังคงใช้ JDK 8 อย่างแม่นยำเนื่องจากปัญหาความเข้ากันได้ที่เกิดจากการลบ API ระหว่าง JDK 8 -> 11
Andy Guibert

2

เวอร์ชันการพึ่งพาที่ฉันต้องการใช้เมื่อรวบรวมสำหรับเป้าหมาย Java 8 แอ็พพลิเคชันที่ทดสอบใน Java 8, 11 และ 12 JREs

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

ในไฟล์ build.gradle ของคุณหากคุณใช้การไล่ระดับสี
silver_mx

1

คุณต้องเพิ่มการพึ่งพา 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>

1

ฉันมีปัญหาที่คล้ายกันหลังจากอัพเกรดโครงการของฉันชวา 11 แล้วสิ่งที่คงที่มันเป็นฤดูใบไม้ผลิที่จะยกระดับการบูต 2.1.1 ซึ่งเห็นได้ชัดว่ามีการสนับสนุน Java 11 นี้ช่วย


โปรดพิจารณาเพิ่มอย่างน้อยส่วนหนึ่งของโซลูชันในคำตอบของคุณเนื่องจากคำตอบแบบลิงก์เท่านั้นจะไม่ถูกต้องหาก URL มีการเปลี่ยนแปลงในอนาคต
yukashima huksay

0

ฉันรู้ว่าฉันมางานปาร์ตี้ช้า แต่ความผิดพลาดของฉันก็จบลงด้วยการต้องการทางออกที่แตกต่าง ... ง่ายมากเช่นกัน

ฉัน depoloyed เพื่อ Tomcat 9 และตระหนักว่าฉันต้องการ 7 ... ฉันลืมที่จะแมปเส้นทางคลาสของฉันกลับไปเป็นรุ่น 7 ใน build.xml

หวังว่าสิ่งนี้จะแก้ไขข้อผิดพลาดของคนอื่นในอนาคตผู้ซึ่งสามารถมองข้ามปัญหาที่เรียบง่ายเช่นนี้ได้!


2
ขณะนี้อาจช่วยให้ OP มันจะดีกว่าที่จะเพิ่มรายละเอียดเพิ่มเติมตัวอย่าง ฯลฯ
ทิว

0

หากคุณกำลังเรียกใช้บริการเว็บ SOAP (ตัวอย่างเช่นการใช้jaxws-maven-plugin) เพียงแค่เพิ่มการพึ่งพานี้ข้อผิดพลาด 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.