프로그래밍 언어/JAVA

java.lang.NoClassDefFoundError 해결 방법 : javax / xml / bind / JAXBException

Rateye 2021. 12. 29. 10:54
728x90
반응형
질문 : java.lang.NoClassDefFoundError 해결 방법 : javax / xml / bind / JAXBException

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

JAXB 클래스는 Java 6 이후 JDK의 일부로 제공되었는데, Java 9에서 더 이상 이러한 클래스를 찾을 수없는 이유는 무엇입니까?

답변

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 를 지정하려고하면 인식 할 수없는 옵션이기 때문에 폭발합니다. 두 가지 옵션 중 하나를 제안합니다.

  1. JDK_J를 사용하여 Java 9+ 옵션만 설정할 수 있습니다.AVA_OPTIONS 환경 변수입니다. 이 환경 변수는 Java 9+용 Java 실행기에 의해 자동으로 읽힙니다.
  2. -XX를 추가할 수 있습니다.+IgnoreIncognedVMOptions JVM이 인식할 수 없는 옵션을 폭파하는 대신 자동으로 무시하도록 합니다. 하지만 조심하세요! 사용하는 다른 명령줄 인수는 더 이상 JVM에 의해 검증되지 않습니다. 이 옵션은 IBM JDK(JDK 8sr4 기준)뿐만 아니라 Oracle/OpenJDK에서도 작동합니다.

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

--add-modules java.se.ee 옵션을 지정하여 런타임에 위의 모든 Java EE 모듈을 사용 가능하게 만들 수 있습니다. java.se.ee 모듈은 위의 Java EE API 모듈뿐만 아니라 java.se.ee 를 포함하는 집계 모듈입니다. Java 11에서는 java.se.ee 가 제거 되었으므로 Java 11에서는 작동하지 않습니다.


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

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

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"
}
출처 : https://stackoverflow.com/questions/43574426/how-to-resolve-java-lang-noclassdeffounderror-javax-xml-bind-jaxbexception
728x90
반응형