Các API JAXB được coi là API Java EE và do đó không còn được chứa trên đường dẫn lớp mặc định trong Java SE 9. Trong Java 11, chúng bị xóa hoàn toàn khỏi JDK.
Java 9 giới thiệu các khái niệm về các mô-đun và theo mặc định, java.se
mô-đun tổng hợp có sẵn trên đường dẫn lớp (hay đúng hơn là đường dẫn mô-đun). Như tên của nó, java.se
mô đun tổng hợp không bao gồm các API Java EE đã được gói theo truyền thống với Java 6/7/8.
May mắn thay, các API Java EE được cung cấp trong JDK 6/7/8 vẫn còn trong JDK, nhưng chúng chỉ không có trên đường dẫn theo mặc định. Các API Java EE bổ sung được cung cấp trong các mô-đun sau:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Giải pháp nhanh và bẩn: (chỉ JDK 9/10)
Để cung cấp API JAXB khi chạy, chỉ định tùy chọn dòng lệnh sau:
--add-modules java.xml.bind
Nhưng tôi vẫn cần điều này để làm việc với Java 8 !!!
Nếu bạn thử chỉ định --add-modules
với một JDK cũ hơn, nó sẽ nổ tung vì đó là một tùy chọn không được nhận dạng. Tôi đề nghị một trong hai lựa chọn:
- Bạn có thể đặt bất kỳ tùy chọn chỉ Java 9+ nào bằng
JDK_JAVA_OPTIONS
biến môi trường. Biến môi trường này được tự động đọc bởi các java
phóng cho Java 9 trở lên.
- Bạn có thể thêm
-XX:+IgnoreUnrecognizedVMOptions
để làm cho JVM âm thầm bỏ qua các tùy chọn không được nhận dạng, thay vì nổ tung. Nhưng hãy cẩn thận! Bất kỳ đối số dòng lệnh nào khác mà bạn sử dụng sẽ không còn được JVM xác nhận cho bạn nữa. Tùy chọn này hoạt động với Oracle / OpenJDK cũng như IBM JDK (kể từ JDK 8sr4).
Giải pháp thay thế nhanh chóng: (chỉ JDK 9/10)
Lưu ý rằng bạn có thể cung cấp tất cả các mô-đun Java EE ở trên trong thời gian chạy bằng cách chỉ định --add-modules java.se.ee
tùy chọn. Các java.se.ee
mô-đun là một module tổng hợp bao gồm java.se.ee
cũng như trên các module Java EE API. Lưu ý, điều này không hoạt động trên Java 11 vì java.se.ee
đã bị xóa trong Java 11.
Giải pháp dài hạn phù hợp: (JDK 9 trở lên)
Các mô-đun Java EE API được liệt kê ở trên đều được đánh dấu @Deprecated(forRemoval=true)
vì chúng được lên lịch để loại bỏ trong Java 11 . Vì vậy, --add-module
cách tiếp cận sẽ không còn hoạt động trong Java 11 out-of-the-box.
Những gì bạn sẽ cần làm trong Java 11 và chuyển tiếp là bao gồm bản sao API Java EE của riêng bạn trên đường dẫn lớp hoặc đường dẫn mô-đun. Ví dụ: bạn có thể thêm API JAX-B dưới dạng phụ thuộc Maven như thế này:
<!-- 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>
Xem trang Thực hiện Tham chiếu JAXB để biết thêm chi tiết về JAXB.
Để biết chi tiết đầy đủ về mô đun Java, xem JEP 261: Hệ thống mô-đun
Dành cho nhà phát triển Gradle hoặc Android Studio: (JDK 9 trở lên)
Thêm các phụ thuộc sau vào build.gradle
tệp của bạn :
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"
}