java.lang.NoClassDefFoundError를 해결하는 방법 : Java 9의 javax / xml / bind / JAXBException


843

Java 6/7/8에서 JDK의 일부로 제공되는 JAXB API 클래스를 사용하는 코드가 있습니다. Java 9에서 동일한 코드를 실행하면 런타임에 JAXB 클래스를 찾을 수 없다는 오류가 발생합니다.

JAXB 클래스는 Java 6부터 JDK의 일부로 제공되었으므로 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

답변:


1223

JAXB API는 Java EE API로 간주되므로 Java SE 9의 기본 클래스 경로에 더 이상 포함되지 않습니다. Java 11에서는 JDK에서 완전히 제거됩니다.

Java 9에는 모듈 개념이 도입되었으며 기본적으로 java.se집계 모듈은 클래스 경로 (또는 모듈 경로)에서 사용할 수 있습니다. 이름에서 알 수 있듯이 java.se집계 모듈에는 전통적으로 Java 6/7/8과 번들로 제공되는 Java EE API가 포함되어 있지 않습니다 .

다행히 JDK 6/7/8에서 제공되는 이러한 Java EE API는 여전히 JDK에 있지만 기본적으로 클래스 경로에는 없습니다. 추가 Java EE API는 다음 모듈에서 제공됩니다.

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. JDK_JAVA_OPTIONS환경 변수를 사용하여 Java 9+ 전용 옵션을 설정할 수 있습니다 . 이 환경 변수가되고 자동으로 읽기 에 의해 java자바 9+에 대한 발사기.
  2. 를 추가 -XX:+IgnoreUnrecognizedVMOptions하지 않고 JVM이 자동으로 인식되지 않는 옵션을 무시하도록 만들 수 있습니다. 그러나 조심하십시오! 사용하는 다른 명령 줄 인수는 더 이상 JVM에서 확인하지 않습니다. 이 옵션은 Oracle / OpenJDK 및 IBM JDK (JDK 8sr4 기준)와 함께 작동합니다.

대체 빠른 솔루션 : (JDK 9/10 만 해당)

--add-modules java.se.ee옵션 을 지정하여 위의 모든 Java EE 모듈을 런타임에 사용 가능하게 할 수 있습니다 . java.se.ee모듈을 포함하는 집계 모듈 java.se.ee뿐만 아니라 위의 자바 EE API 모듈. 참고,이 자바 (11)에서 작동하지 않습니다 때문에 java.se.ee자바 (11)에서 제거되었다.


적절한 장기 솔루션 : (JDK 9 이상)

위에 나열된 Java EE API 모듈은 모두 Java 11 에서 제거 예정@Deprecated(forRemoval=true) 이므로 표시되어 있습니다. 따라서이 접근 방식은 더 이상 Java 11 기본 제공에서 작동하지 않습니다.--add-module

Java 11 이상에서 수행해야 할 작업은 클래스 경로 또는 모듈 경로에 자신의 Java EE API 사본을 포함시키는 것입니다. 예를 들어 JAX-B API를 다음과 같이 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에서 더 이상 Java 10에서 JAXB를 더 이상 런타임에 사용할 수 없을 가능성이 있습니까? 거꾸로 한 단계처럼 보입니다. JAXB를 종속성으로 포함시키는 6 단계 이전 연습으로 돌아 가야합니다.
Michael

4
해결 방법으로 --add-modules java.se.ee 또는 --add-modules ALL-SYSTEM을 사용하는 것은 Java EE와 공유되지 않는 모듈 섹션의 docs.oracle.com/javase/9/migrate 마이그레이션 안내서에 따라 권장 되지 않습니다. 기본적으로 해결 -> 포인트 1
justMe

6
Java 10이 공식적으로 출시되면 add-modules 메소드가 여전히 작동하는지 확인할 수 있습니다. 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>


9
이와 같은 gradle 의존성을 추가하면 testCompile('javax.xml.bind:jaxb-api')나에게 도움이되었습니다.
pamcevoy 2016 년

5
@pamcevoy가 언급했듯이 Spring Boot를 사용할 때 jaxb-api 버전을 지정할 필요가 없습니다. 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 내에 지정되어 있음). 이 종속성 목록을 지정하기 만하면됩니다.

<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
@Anil 이것은 pom.xmlMaven 구성 파일입니다. 그것이 무엇인지 모른다면, 시작부터 시작하는 것이 좋습니다
Andremoniy

8
잘못된 반사 액세스 작업이 발생했습니다 경고 : com.sun.xml.bind.v2.runtime.reflect.opt.Injector (파일 : / C : /Users/eis/.m2/repository/com/sun/에 의한 잘못된 반사 액세스 java.lang.ClassLoader.defineClass (java.lang.String, byte [], int, int) 메소드에 대한 xml / bind / jaxb-impl / 2.3.0 / jaxb-impl-2.3.0.jar) 경고 : 고려하십시오 com.sun.xml.bind.v2.runtime.reflect.opt.Injector의 관리자에게이를보고 경고 : --illegal-access = warn을 사용하여 추가로 불법적 인 반사 액세스 작업에 대한 경고를 활성화하십시오. 경고 : 모든 불법 액세스 작업은 다음 릴리스에서 거부
Stefan

1
이것은 JDK 9.0.4에서 나를 위해 일했습니다 (Maven 3.5.3의 Maven 플러그인을 통해 JAXB 관련 코드를 호출했습니다). <dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>마지막 종속성으로 사용하지만 .
scrutari

1
대박. 나는 어떤 이유로 봄 부트 앱이 intellij CE에서 실행되지만 mac에서는 일식이 아니라 일식에서는 있지만 win10의 intellij CE가 아닌 상황이있었습니다. 두 개의 플랫폼에서 하나의 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에 의존 할 수도 있습니다.

메이븐

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

그래들

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

Java 8 앱의 종속성으로 추가 인수없이 JRE 8 또는 JRE 9 둘 다에서 실행할 수있는 * .jar을 생성합니다.

또한 JAXB API를 사용하기 전에 어딘가에서 실행해야합니다.

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

해결 방법으로 지금까지 잘 작동합니다. 그래도 완벽한 솔루션처럼 보이지는 않습니다 ...


5
org.eclipse.persistence:eclipselinkJAXB API를 얻기 위해 추가 하는 것은 이미 eclipselink를 사용하지 않는 한 매우 무거운 종속성입니다.
Andy Guibert

4
예, 무겁고 (~ 9mb) 예, 이미 사용하고 있습니다. 나는 이것이 일시적으로 명령 줄 인수를 제공하지 않고 동일한 jar / war에 대해 8 및 9 JRE를 모두 사용해야하는 사람들을위한 대안 대안이라고 간단히 언급했습니다.
Mikhail Kholodkov

2
JDK 8과 9 사이의 interop을 위해 -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, artifactId 에 의존 할 수도 있습니다 org.eclipse.persistence.moxy.
Jesper

36

모든 JDK에 대한 깨끗한 솔루션> = 9

빌드에 두 가지 종속성을 추가해야합니다

  • jaxb-api
  • jaxb 구현

구현으로 나는 glass com의 참조 구현을 사용하여 오래된 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.activation을 더 이상 추가 할 필요가 없습니다. ( 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에만 있습니다.
Sebastian Thees

1
Java 12의 다중 모듈 프로젝트와 완벽하게 작동합니다.
Heril Muratovic

35

jdk 9 이상 버전을 사용하는 경우 Java 버전이므로 pom에 추가하십시오.

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

1
나는 스프링 부트 가이드와 함께 항상 이것에 부딪쳤다. 고마워.
masterxilo

2
@Cesar Rodriguez T, 나는 이것을 swagger 예제로 시도하고 컴파일이 작동했지만 실행 중 오류가 발생했습니다. 더 많은 의존성을 포함하고 효과가있는 선택된 답변을 사용했습니다.
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. Java 빌드 경로에 가져온 JAR 파일 추가

4
점을 유의 com.sun.xml.bind유물이 오래된 및 이전 버전과의 호환성을 위해서만 제공. org.glassfish.jaxb다른 답변 중 일부에서 언급했듯이 동등한 아티팩트를 대신 사용해야합니다 .
Jesper

이것은 나를 위해 작동하지 않았습니다. 오류가 발생하여 특정 클래스를 찾을 수 없다고 말했습니다.
RamenChef

Grails 3.4.10 응용 프로그램을 배포 할 때 Mint 19.2 (Ubuntu 18.04 base) 아래의 tomcat9 / lib 폴더에 넣을 때 나를 위해 일했습니다.
Mohamad Fakih


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.bindJVM 옵션을 사용 하여 xml 바인드 모듈을 JVM 런타임 환경에 추가 할 수 있습니다 .

예 : java --add-modules=java.xml.bind XmlTestClass


11

2019 년 4 월 업데이트

JAXB 릴리스에 대한 Changelong은 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에 있습니다.

JAXB 아티팩트에 대한 Maven 좌표

jakarta.xml.bind : jakarta.xml.bind-api : JAXB 용 API 클래스. JAXB에 대해 컴파일하는 데 필요합니다.

org.glassfish.jaxb : jaxb-runtime : JAXB의 구현, XML과의 자바 객체 직렬화 및 역 직렬화에 사용되는 런타임.

JAXB 지방 병 번들 :

com.sun.xml.bind : jaxb-impl : JAXB 런타임 팻 jar.

org.glassfish.jaxb 아티팩트와 달리이 jar에는 모든 종속성 클래스가 포함되어 있습니다. 이러한 아티팩트에는 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

원래 답변

다음 내 Maven 프로젝트에서 JAXB RI 사용해야 어떤 유물? 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다른 곳에서 본 종속성 이 실제로 중복되어 있음을 보여 주셔서 감사합니다 . 글래스 피쉬 의존성은 당깁니다. 방금 시도했지만 실제로 작동합니다.
Basil Bourque


8

pom.xml에 javax.xml.bind 종속성 추가

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

8

JavaEE는 이제 https://jakarta.ee/ 에 의해 관리되므로 2.3.2 기준의 새로운 Maven 좌표는 다음과 같습니다.

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을 따르고 아래 설정이 실제로 도움이되었습니다. Macbook Pro에서 STS IDE와 함께 Java 10을 사용합니다. 그것은 매력처럼 작동합니다.

   <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

이것은 Java 12에서 Apache Camel 2.24.1을 실행하는 종속성 관련 문제를 해결했습니다.

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

내 경우에는 내가 치어 파일에 의존 바람둥이 추가 할 필요가
GvSharma

6

2.0.5.RELEASEJava 11에서 Spring Boot 를 사용하는 것과 동일한 문제가 발생했습니다 .

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 런타임이 포함되어 있습니다.
Sebastian Thees

Spring Boot 2.1.0.RELEASE에서는 JAXB가 더 이상 필요하지 않은 것 같습니다 -github.com/spring-projects/spring-boot/releases
Burrich

5

JDK 9+를 사용할 때 JAX-B 종속성을 추가해야합니다. Android Studio 사용자 build.gradle의 경우이를 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

또한 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 추가와 관련하여이 모든 것들을 시도했습니다. 이제 분할!

따라서이 참조를 확인하십시오 : 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

대답은 아니지만 부록 : groovyshJAVA_HOME이 Java 9 설치 ( java version "9.0.1"정확히)를 가리키는 경우 실행 (Groovy 2.4.13)이 심해 져서 얻었습니다 .

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

해결책은 다음과 같습니다.

  • github.io 의 JAXB 프로젝트 로 이동하십시오 ( "JAXB는 이중 라이센스에 따라 라이센스가 부여됨-클래스 경로 예외가있는 CDDL 1.1 및 GPL 2.0" ).

  • 다운로드 jaxb-ri-2.3.0.zip

  • Java 인프라 파일을 넣을 때마다 압축을 풉니 다 (제 경우에는 /usr/local/java/jaxb-ri/). 다른 솔루션이 존재할 수 있습니다 (SDKMAN, I dunno를 통해 가능)

  • lib 서브 디렉토리의 jar 파일이 CLASSPATH . 나는 bash 시작시 시작된 스크립트를 통해 /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 개발자는 일반적으로 Jar를 수동으로 다운로드하는 대신 Gradle 또는 Maven과 같은 빌드 도구를 사용하여 종속성을 관리합니다. 그것은 아마도 다운 투표 이유입니다.
Joshua Davis


2

좋아, 나는 같은 종류의 문제가 있었지만 Java 8을 사용하고 있었고이 오류가 계속 발생하여 대부분의 솔루션을 시도했습니다. 하지만 내 maven이 여전히 Java 9를 가리키고 있지만 전역 Java 버전을 8로 설정했지만 모든 것이 제대로 작동한다는 것을 알았습니다.

이런 종류의 문제가있는 사람은 기본 Java를 사용하도록 Maven을 수정하는 방법을 확인하십시오.


2

이전 답변 "amazoncorretto로 전환하여 문제가 해결되었습니다"뉴스 답변 : corretto latest를 사용했지만 jdk 1.8과 유사합니다. 어쨌든 우리는 수동으로 의존성을 추가해야합니다.


2
JDK 11 용 Amazon Corretto 배포는 javax.xml.bind 클래스를 제공하지 않습니다. Correto로 전환 한 후에 문제가 해결되면 JDK 8로 다운 그레이드 되었기 때문입니다.
Andy Guibert

이상한, 내가 확인합니다, docker에서 내가 correto 최신을 사용
Armen Arzumanyan

예, amazoncorretto:latest현재 11이 아닌 JDK 8을 제공합니다. 많은 Docker 이미지는 여전히 JDK 8을 기반으로합니다. JDK 8-> 11
Andy Guibert

2

Java 8 대상을 컴파일 할 때 사용해야하는 종속성 버전입니다. Java 8, 11 및 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

Java 11에서 gradle과 gradle은 이것이 효과가 있습니다.

plugins {
      id 'java'
}

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

정확히 어디에 넣을까요?
Nyxee

gradle을 사용하는 경우 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)에 내 프로젝트를 업그레이드 한 후 비슷한 문제가 있었다, 그 다음 무엇을 그것은 분명히 자바 (11)에 대한 지원을하고 봄 부팅 2.1.1로 업그레이드했습니다 고정 도움이


나중에 URL이 변경되면 링크 전용 답변이 유효하지 않으므로 답변에 솔루션의 일부를 추가하는 것이 좋습니다.
yukashima huksay

0

나는 파티에 늦었다는 것을 알고 있지만 내 실수로 인해 다른 솔루션이 필요했습니다.

원래 Tomcat 9로 depoloyed하고 7이 필요하다는 것을 깨달았습니다 ... 클래스 경로를 build.xml의 7 버전으로 다시 매핑하는 것을 잊었습니다.

바라건대 이것은 나중에 다른 사람의 실수를 해결할 것입니다.이 오류는 내가했던 것처럼이 간단한 문제를 간과합니다!


2
이것은 OP에 도움이 될 수 있지만 자세한 내용, 예제 등을 추가하는 것이 좋습니다.
Tiw

0

jaxws-maven-plugin이 종속성을 추가 하여 SOAP 웹 서비스 (예 :를 사용하여 ) 를 호출하는 경우 모든 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.