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 รุ่นเก่ามันจะระเบิดเพราะเป็นตัวเลือกที่ไม่รู้จัก ฉันแนะนำหนึ่งในสองตัวเลือก:
- คุณสามารถตั้งค่าตัวเลือก Java 9+ เท่านั้นโดยใช้
JDK_JAVA_OPTIONS
ตัวแปรสภาพแวดล้อม ตัวแปรสภาวะแวดล้อมนี้ถูกอ่านโดยjava
ตัวเรียกใช้งานอัตโนมัติสำหรับ Java 9+
- คุณสามารถเพิ่มการ
-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"
}