Cách giải quyết java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException trong Java 9


845

Tôi có một số mã sử dụng các lớp API JAXB đã được cung cấp như một phần của JDK trong Java 6/7/8. Khi tôi chạy cùng mã với Java 9, trong thời gian chạy, tôi gặp lỗi cho biết các lớp JAXB không thể tìm thấy.

Các lớp JAXB đã được cung cấp như một phần của JDK kể từ Java 6, vậy tại sao Java 9 không còn có thể tìm thấy các lớp này?


2
Phần bổ sung trong câu trả lời này liên quan đến việc di chuyển các API này.
Naman

7
xây dựng với Java 8 sẽ giúp mã của bạn biên dịch có, nhưng khi bạn cố chạy mã được biên dịch đó trên Java 9+ thì nó sẽ thất bại vì không có JAX-B.
Andy Guibert

1
Đối với Java 11, giải pháp của bài viết này được cập nhật: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext
Eric Wang

Câu trả lời:


1224

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.semô-đ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.semô đ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-modulesvớ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:

  1. Bạn có thể đặt bất kỳ tùy chọn chỉ Java 9+ nào bằng JDK_JAVA_OPTIONSbiến môi trường. Biến môi trường này được tự động đọc bởi các javaphóng cho Java 9 trở lên.
  2. 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.eetùy chọn. Các java.se.eemô-đun là một module tổng hợp bao gồm java.se.eecũng như trên các module Java EE API. Lưu ý, điều này không hoạt động trên Java 11java.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-modulecá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.gradletệ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"
}

8
Vì vậy, nếu các mô-đun API Java EE được đánh dấu không dùng nữa, điều đó có nghĩa là có khả năng JAXB trong Java 10 sẽ không còn khả dụng trong thời gian chạy trong Java 10? Đó dường như là một bước lùi. Chúng tôi sẽ phải quay trở lại thực tiễn trước 6 bao gồm JAXB như một sự phụ thuộc.
Michael

4
Sử dụng --add-mô-đun java.se.ee hoặc --add-mô-đun ALL-HỆ THỐNG làm giải pháp không được khuyến nghị theo hướng dẫn di chuyển ở đây docs.oracle.com/javase/9/migrate trong phần Mô-đun được chia sẻ với Java EE Không Được giải quyết theo mặc định -> điểm 1
justMe

6
Với Java 10 được phát hành chính thức, chúng tôi có thể xác nhận rằng phương thức add-module vẫn sẽ hoạt động. Các javax.xml.bindlớp JavaEE khác được lên lịch để loại bỏ trong Java 11, theo JEP-320 .
Joep Weijers

10
Và bây giờ Java 11 được phát hành và java.se.eemô-đun đã bị xóa, vì vậy --add-modulesgiải pháp không còn hoạt động nữa. Sử dụng giải pháp được đề xuất thay thế: thêm JAXB làm phụ thuộc riêng.
Jesper

11
Tôi đã thêm các phụ thuộc này và nó vẫn gây ra lỗi tương tự. bất cứ ý tưởng tại sao?
João Vieira

262

Trong trường hợp của tôi (lọ mỡ khởi động mùa xuân) tôi chỉ cần thêm phần sau vào pom.xml.

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


9
Thêm phụ thuộc lớp như thế này testCompile('javax.xml.bind:jaxb-api')làm việc cho tôi.
pamcevoy

5
Giống như @pamcevoy đã đề cập, không cần chỉ định phiên bản của jaxb-api khi sử dụng Spring Boot. Boot tự động quản lý phiên bản.
Marcel Overdijk

2
Tôi đề nghị sử dụng <scope>runtime</scope>cho trường hợp như vậy
VladS

5
@ Liên kết của Tuno không hoạt động với tôi, liên kết cố định là: github.com/spring-projects/spring-boot/wiki/ mẹo
Francisco Mateo

69

Không có giải pháp nào trong số này hoạt động tốt với tôi trong JDK 9.0.1 gần đây.

Tôi thấy rằng danh sách các phụ thuộc này là đủ cho một chức năng phù hợp, vì vậy bạn không cần chỉ định rõ ràng --add-module(mặc dù nó được chỉ định trong các pom của các phụ thuộc này). Điều duy nhất bạn cần là chỉ định danh sách phụ thuộc này:

<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
Đối với JDK 8, loại bỏ jaxb-core và jaxb-impl ở trên.
foo

3
@Anil đây là một pom.xmltập tin cấu hình Maven. Nếu bạn không biết đó là gì, thì tốt hơn là bắt đầu từ ăn xin
Andremoniy

8
Một hoạt động truy cập phản xạ bất hợp pháp đã xảy ra CẢNH BÁO: Truy cập phản chiếu bất hợp pháp bởi com.sun.xml.bind.v2.r nb.reflect.opt.Injection (tệp: / C: /Users/eis/.m2/reposeective/com/sun/ xml / bind / jaxb-impl / 2.3.0 / jaxb-impl-2.3.0.jar) để phương thức java.lang.ClassLoader.defineClass (java.lang.String, byte [], int, int) CẢNH BÁO: Vui lòng xem xét báo cáo điều này với những người duy trì com.sun.xml.bind.v2.r Yoon.reflect.opt.Injection CẢNH BÁO: Sử dụng --illegal-access = cảnh báo để bật cảnh báo về các hoạt động truy cập phản xạ bất hợp pháp nữa CẢNH BÁO: Tất cả các hoạt động truy cập bất hợp pháp sẽ được bị từ chối trong phiên bản tương lai
Stefan

1
Điều này làm việc với tôi trên JDK 9.0.4 (Tôi đã gọi mã liên quan đến JAXB thông qua plugin Maven với Maven 3.5.3). Mặc dù tôi sẽ sử dụng <dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>như phụ thuộc cuối cùng.
Scrutari

1
Tuyệt vời. Tôi đã có một tình huống - vì một số lý do - một ứng dụng khởi động mùa xuân sẽ chạy trong intellij CE nhưng không nhật thực trên mac, và trong nhật thực nhưng không phải intellij CE trên win10. Có thể làm việc trong một IDE trên hai nền tảng là một lợi thế.
kometen

42

Điều này làm việc cho tôi:

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

Cập nhật

Như @Jasper đã đề xuất, để tránh phụ thuộc vào toàn bộ thư viện EclipseLink, bạn cũng có thể chỉ phụ thuộc vào EclipseLink MOXy:

Maven

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.moxy</artifactId>
    <version>2.7.3</version>
</dependency>

Học sinh lớp

compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'

Là các phụ thuộc cho ứng dụng Java 8 của tôi, tạo ra * .jar có thể được chạy bởi cả JRE 8 hoặc JRE 9 mà không có đối số bổ sung.

Ngoài ra, điều này cần được thực thi ở đâu đó trước khi API JAXB sẽ được sử dụng:

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

Làm việc tuyệt vời cho đến nay, như một cách giải quyết. Không giống như một giải pháp hoàn hảo mặc dù ...


5
thêm org.eclipse.persistence:eclipselinkchỉ để nhận API JAXB là một sự phụ thuộc rất nặng nề, trừ khi bạn đang sử dụng eclipselink?
Andy Guibert

4
Có, nó rất nặng (~ 9mb) và vâng tôi đã sử dụng nó rồi. Tôi đã đề cập rằng đây đơn giản là một cách giải quyết khác cho những người, có thể là tạm thời, sẽ phải sử dụng cả 8 và 9 JRE cho cùng một jar / war mà không cung cấp các đối số dòng lệnh.
Mikhail Kholodkov

2
vì mục đích xen kẽ giữa JDK 8 & 9, tôi khuyên bạn nên sử dụng -XX:+IgnoreUnrecognizedVMOptionstùy chọn dòng lệnh (cập nhật câu trả lời của tôi với chi tiết)
Andy Guibert

System.setProperty ("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); không làm việc cho tôi
David Brossard

1
Để tránh phụ thuộc vào toàn bộ thư viện EclipseLink, bạn cũng có thể chỉ phụ thuộc vào EclipseLink MOXy: groupId org.eclipse.persistence, artifactId org.eclipse.persistence.moxy.
Jesper

36

giải pháp sạch cho tất cả các JDK> = 9

Bạn cần thêm hai phụ thuộc vào bản dựng của mình

  • jaxb-api
  • thực hiện jaxb

Là một triển khai, tôi đã chọn sử dụng triển khai tham chiếu bởi cá thủy tinh để loại bỏ các lớp / thư viện com.sun cũ. Vì vậy, kết quả là tôi đã thêm vào bản dựng maven của mình

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

Lưu ý rằng từ phiên bản 2.3.1, bạn không cần thêm javax.activation nữa. (xem https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )


Mô-đun javax.xml.bind có thực sự cần thiết không? Mã của tôi trong JDK 11 hoạt động mà không có nó.
k.liakos

@ k.liakos Tôi không chắc. Jaxb-runtime jar và api-jar không chia sẻ cùng các lớp / gói. Tôi đoán nó phụ thuộc vào mã của bạn. Nếu mã của bạn không sử dụng các lớp từ gói 'javax.xml.bind' thì có lẽ bạn không cần nó. Chủ đề của chủ đề này là 'javax / xml / bind / JAXBException' không thể tìm thấy; lớp học này chỉ có trong jaxb-api.
Sebastian Thees

1
Hoạt động hoàn hảo với dự án đa mô-đun trong java 12.
Heril Muratovic

35

Nó là phiên bản java vì nếu bạn đang sử dụng jdk 9 hoặc phiên bản mới hơn, hãy thêm cái này vào pom của bạn

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

1
Tôi luôn gặp phải vấn đề này với các hướng dẫn Spring Boot ... Cảm ơn rất nhiều.
masterxilo

2
@Cesar Rodriguez T, tôi đã thử điều này với một ví dụ vênh vang và biên dịch làm việc nhưng chạy bị lỗi. Tôi đã sử dụng câu trả lời được chọn trong đó bao gồm nhiều phụ thuộc hơn và nó đã hoạt động.
PatS

Trên tệp pom.xml của dự án của bạn
Cesar Rodriguez T

22

Để giải quyết điều này, tôi đã nhập một số tệp JAR trong dự án của mình:

  • 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. Tải về các tập tin trên và sao chép chúng vào thư mục libs trong dự án
  2. Thêm các tệp JAR đã nhập trong Đường dẫn xây dựng Java

4
Lưu ý rằng các com.sun.xml.bindtạo phẩm đã cũ và chỉ được cung cấp để tương thích ngược. Bạn nên sử dụng các org.glassfish.jaxbtạo tác tương đương thay thế, như được đề cập trong một số câu trả lời khác.
Jesper

Điều này đã không làm việc cho tôi. Nó đã đưa ra một lỗi và nói rằng nó không thể tìm thấy một lớp cụ thể.
RamenChef

Làm việc cho tôi khi tôi đặt chúng vào thư mục tomcat9 / lib trong Mint 19.2 (cơ sở Ubuntu 18.04), khi triển khai ứng dụng Grails 3.4.10.
Mohamad Fakih

18

Tại thời điểm biên dịch cũng như thời gian chạy, thêm công tắc --add-modules java.xml.bind

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

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

Một giới thiệu tốt về các JDK 9mô-đun cũng có thể được tìm thấy tại: https://www.youtube.com/watch?v=KZfbRuvv5qc


11

Điều này làm việc cho tôi. Chỉ thêm jaxb-api là không đủ.

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

Và jaxb-api.version được đặt thành gì?
MiguelMunoz

@MiguelMunoz Tôi đã sử dụng 2.2.7
Mr Jedi

2
Lưu ý rằng các com.sun.xml.bindtạo phẩm đã cũ và chỉ được cung cấp để tương thích ngược. Bạn nên sử dụng các org.glassfish.jaxbtạo tác tương đương thay thế, như được đề cập trong một số câu trả lời khác.
Jesper

11

Chuyển đến Build.gradle của bạn và thêm các phụ thuộc bên dưới cho cả Java 9 hoặc 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

Bạn có thể dùng --add-modules=java.xml.bind tùy chọn JVM để thêm mô đun liên kết xml vào môi trường thời gian chạy JVM.

Ví dụ: java --add-modules=java.xml.bind XmlTestClass


11

Cập nhật tháng 4 năm 2019

Changelong cho các bản phát hành JAXB là tại https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html

trích đoạn:

    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

Liên kết có thẩm quyền có tại https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts

Tọa độ Maven cho các tạo phẩm JAXB

jakarta.xml.bind: jakarta.xml.bind-api: Các lớp API cho JAXB. Cần thiết để biên dịch chống lại JAXB.

org.glassfish.jaxb: jaxb-runtime: Triển khai JAXB, thời gian chạy được sử dụng để tuần tự hóa và giải tuần tự hóa các đối tượng java đến / từ xml.

Gói chất béo JAXB:

com.sun.xml.bind: jaxb-impl: jar chất béo thời gian chạy JAXB.

Trái ngược với các tạo phẩm org.glassfish.jaxb, các lọ này có tất cả các lớp phụ thuộc được bao gồm bên trong. Những tạo phẩm này không chứa mô tả mô-đun JPMS. Trong các dự án Maven, các tạo tác org.glassfish.jaxb được cho là sẽ được sử dụng thay thế.

org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 kéo vào:

[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

Câu trả lời gốc

Sau Những hiện vật tôi nên sử dụng cho JAXB RI trong dự án Maven của tôi? trong Maven, bạn có thể sử dụng một hồ sơ như:

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

Cây phụ thuộc cho thấy:

[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

Để sử dụng điều này trong Eclipse, giả sử Oxygen.3a Release (4.7.3a) trở lên, Ctrl-Alt-P hoặc nhấp chuột phải vào dự án, Maven, sau đó chọn hồ sơ.


Cảm ơn đã cho thấy rằng một sự phụ thuộc cho javax.xml.bind> jaxb-apimà tôi đã thấy ở nơi khác thực sự là dư thừa. Các phụ thuộc cá thủy tinh kéo nó là. Tôi đã thử nó, và nó thực sự hoạt động.
Basil Bourque


8

thêm phụ thuộc javax.xml.bind trong pom.xml

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

8

Vì JavaEE hiện được quản lý bởi https://jakarta.ee/ , tọa độ Maven mới kể từ 2.3.2 là:

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

Jaxb.version được phát hành đầu tiên là 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

Tôi đã theo URL này và các cài đặt bên dưới đã thực sự giúp tôi. Tôi sử dụng Java 10 với STS IDE trong Macbook Pro. Nó hoạt động như một say mê.

   <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

Điều này đã giải quyết các vấn đề của tôi với các phụ thuộc chạy Apache Camel 2.24.1 trên 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>

trong trường hợp của tôi, tôi cần thêm phụ thuộc tomcat vào tệp pom
GvSharma

6

Tôi đã gặp vấn đề tương tự khi sử dụng Spring Boot 2.0.5.RELEASEtrên Java 11.

Thêm javax.xml.bind:jaxb-api:2.3.0một mình không khắc phục được vấn đề. Tôi cũng đã phải cập nhật Spring Boot lên Cột mốc mới nhất 2.1.0.M2, vì vậy tôi cho rằng điều này sẽ được khắc phục trong bản phát hành chính thức tiếp theo.


Điều này không liên quan đến tôi. có một số giải pháp trong luồng này hoạt động bất kể sử dụng spring boot 2. (Tôi cũng sử dụng spring boot 2.0.5.RELEASE btw). Có thể trong Spring 2.1.0.M2 đã có thời gian chạy jaxb đi kèm.
Sebastian Thees

Có vẻ như với Spring Boot 2.1.0.RELEASE, JAXB không còn cần thiết nữa - github.com/spring-projects/spring-boot/release
Burrich

5

Bạn cần thêm các phụ thuộc JAX-B khi sử dụng JDK 9+. Đối với Android Studio sử dụng, bạn sẽ cần để thêm video này của bạn build.gradle's dependencies {}khối:

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

Không hoạt động cho các bài kiểm tra đơn vị mặc dù
Malachiasz

Tôi đã sửa đổi câu trả lời của bạn để làm việc với các bài kiểm tra Đơn vị.
Malachiasz

4

Tôi cũng đã tình cờ tìm thấy ClassNotFoundException: javax.xml.bind.DatatypeConverter bằng Java 11

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

Tôi đã thử tất cả những thứ này xung quanh việc thêm javax.xml.bind: jaxb-api hoặc spring boot jakarta.xml.bind-api .. Tôi tìm thấy một gợi ý để sửa lỗi trong phiên bản jjwt 0.10.0 .. nhưng quan trọng nhất là gói jjwt là bây giờ chia tay!

Do đó, hãy kiểm tra tài liệu tham khảo này: https://github.com/jwtk/jjwt/issues/510

Đơn giản, nếu bạn sử dụng

Java11 và jjwt 0.9.x và bạn phải đối mặt với vấn đề ClassNotFoundException: javax.xml.bind.DatatypeConverter,

đi

jjwt phiên bản 0.11.x, nhưng sử dụng các gói được chia: https://github.com/jwtk/jjwt#install

Bạn sẽ không tìm thấy phiên bản cao hơn cho sự phụ thuộc của jjwt, vì họ chia các gói.

Chúc mừng.


3

Không phải là một câu trả lời, mà là một phụ lục: Tôi đã nhận được vì đang chạy groovysh (Groovy 2.4.13) nếu JAVA_HOME trỏ đến bản cài đặt Java 9 ( java version "9.0.1"chính xác) không thành công:

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

Giải pháp là:

  • Chuyển đến Dự án JAXB tại github.io ( "JAXB được cấp phép theo giấy phép kép - CDDL 1.1 và GPL 2.0 với Ngoại lệ đường dẫn lớp" )

  • Tải xuống jaxb-ri-2.3.0.zip

  • Giải nén bất cứ nơi nào bạn đặt các tệp cơ sở hạ tầng java của bạn (trong trường hợp của tôi, /usr/local/java/jaxb-ri/ ). Giải pháp khác có thể tồn tại (có thể thông qua SDKMAN, tôi không biết)

  • Hãy chắc chắn rằng các lọ trong thư mục con lib nằm trên CLASSPATH. Tôi thực hiện nó thông qua một tập lệnh bắt đầu khi khởi động bash, được gọi /etc/profile.d/java.sh, trong đó tôi đã thêm (trong số nhiều dòng khác) vào vòng lặp sau:

Được đóng gói thành một chức năng ...

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

Và nó hoạt động!


1
Tôi không hiểu các downvotze. Rõ ràng mọi người muốn tập trung xung quanh với các tùy chọn dòng lệnh thay vì thực sự nhận được các lọ? Tùy bạn thôi.
David Tonhofer

7
Các nhà phát triển Java thường sử dụng các công cụ xây dựng như Gradle hoặc Maven để quản lý các phụ thuộc thay vì tải xuống các tệp thủ công. Đó có lẽ là lý do cho các phiếu giảm.
Joshua Davis

3

Bạn chỉ cần 1 phụ thuộc:

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

2

OK, tôi đã gặp vấn đề tương tự, nhưng tôi đang sử dụng Java 8 và liên tục gặp lỗi này, tôi đã thử hầu hết các giải pháp. nhưng hóa ra maven của tôi vẫn chỉ vào java 9 - mặc dù tôi đã đặt phiên bản Java toàn cầu thành 8, ngay sau khi tôi sửa rằng tất cả đều hoạt động.

Đối với bất kỳ ai có thể gặp phải loại sự cố này, hãy xem Cách khắc phục Maven để sử dụng Java mặc định


2

Câu trả lời cũ "Vấn đề được giải quyết bằng cách chuyển sang amazoncorretto" Tin tức trả lời: Tôi đã sử dụng Corretto mới nhất, nhưng tương tự jdk 1.8. Vì vậy, dù sao chúng ta cần thêm phụ thuộc bằng tay


2
Phân phối Amazon Corretto cho JDK 11 không cung cấp các lớp javax.xml.bind. Nếu sự cố đã được giải quyết sau khi chuyển sang Correto, đó là do bạn đã hạ cấp xuống JDK 8.
Andy Guibert

Thật lạ, tôi sẽ kiểm tra, trong docker tôi đã sử dụng Correto mới nhất
Armen Arzumanyan

Yea, amazoncorretto:latesthiện cung cấp cho JDK 8 chứ không phải 11. Nhiều hình ảnh Docker vẫn dựa trên JDK 8, chính xác là do các vấn đề tương thích gây ra bởi việc xóa API giữa JDK 8 -> 11
Andy Guibert

2

Các phiên bản phụ thuộc mà tôi cần sử dụng khi biên dịch cho mục tiêu Java 8. Ứng dụng đã thử nghiệm trong Java 8, 11 và 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 -->

2

Đối với tôi trong Java 11 và gradle đây là những gì đã làm việc:

plugins {
      id 'java'
}

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

Chính xác thì chúng ta đặt nó ở đâu?
nyxee

Trong tệp build.gradle của bạn nếu bạn đang sử dụng gradle.
bạc_mx

1

Bạn cần thêm các phụ thuộc jaxb vào maven. Phiên bản triển khai cá thủy tinh 2.3.2 hoàn toàn tương thích với phiên bản api jaxb EE jaxb mới 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

Tôi đã gặp vấn đề tương tự sau khi nâng cấp dự án của mình lên java 11, sau đó đã sửa lỗi nâng cấp lên spring boot 2.1.1, điều này rõ ràng có hỗ trợ cho java 11, điều này giúp ích


vui lòng xem xét thêm ít nhất một phần của giải pháp trong câu trả lời của bạn vì các câu trả lời chỉ liên kết sẽ trở nên không hợp lệ nếu url thay đổi trong tương lai.
yukashima huksay

0

Tôi biết tôi đến bữa tiệc muộn, nhưng lỗi của tôi cuối cùng lại cần một giải pháp khác biệt ... cũng siêu đơn giản

Ban đầu, tôi đã chán ghét Tomcat 9 và nhận ra rằng tôi cần 7 ... Tôi đã quên ánh xạ đường dẫn lớp của mình trở lại phiên bản 7 trong build.xml

Hy vọng rằng điều này sẽ khắc phục lỗi của ai đó trong tương lai, người quản lý để bỏ qua vấn đề đơn giản này như tôi đã làm!


2
Mặc dù điều này có thể giúp OP, nhưng tốt hơn là thêm nhiều chi tiết, ví dụ, v.v.
Tiw

0

Nếu bạn đang gọi các dịch vụ web SOAP (ví dụ: sử dụng jaxws-maven-plugin) chỉ bằng cách thêm phụ thuộc này, tất cả các lỗi JAXB sẽ biến mất:

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

Đã thử nghiệm với Java 13

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.