질문 : 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
를 지정하려고하면 인식 할 수없는 옵션이기 때문에 폭발합니다. 두 가지 옵션 중 하나를 제안합니다.
- JDK_J를 사용하여 Java 9+ 옵션만 설정할 수 있습니다.AVA_OPTIONS 환경 변수입니다. 이 환경 변수는 Java 9+용 Java 실행기에 의해 자동으로 읽힙니다.
- -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
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
Java에서 파일의 파일 확장자를 얻는 방법 (0) | 2021.12.29 |
---|---|
NullPointerExceptions를 방지하기 위해 어떤 @NotNull Java 주석을 사용해야 할까? (0) | 2021.12.29 |
Java에서 파일을 byte []로 변환하는 방법 (0) | 2021.12.29 |
JAVA Implements vs extends 차이점과 사용시기 (0) | 2021.12.29 |
Java 쿼리 문자열 매개 변수의 URL 인코딩 (0) | 2021.12.19 |