1. 문제 개요
Java 9 이후로 javax.xml.bind.JAXBException
관련 클래스가 JDK 기본 클래스 경로(classpath)에서 제거되었습니다. 이 문제는 Java 11 이후로 더욱 심화되어, 해당 모듈이 JDK에서 완전히 제거되면서 발생합니다. 이 문서는 발생 원인과 해결 방법을 단계별로 자세히 설명합니다.
2. 주요 원인
- Java 9의 모듈 시스템 도입
javax.xml.bind
는 Java EE API에 포함되며, Java 9부터는 기본 클래스 경로에서 제외되었습니다.- 관련 모듈은
java.xml.bind
에 포함되어 있지만, 명시적으로 추가하지 않으면 사용할 수 없습니다.
- Java 11에서의 API 제거
- Java EE 관련 모듈들이 완전히 제거되어 더 이상 JDK에서 지원되지 않습니다.
3. 해결 방법
3.1 Java 9/10에서의 임시 해결 방법
1. 명령줄 옵션 추가
다음 명령어로 java.xml.bind
모듈을 추가하여 문제를 해결할 수 있습니다.
java --add-modules java.xml.bind -cp YourApplication.jar YourMainClass
2. java.se.ee
모듈 추가
모든 Java EE 모듈을 포함하려면 아래와 같이 실행합니다.
java --add-modules java.se.ee -cp YourApplication.jar YourMainClass
주의:
Java 11 이후부터는 java.se.ee
모듈이 제거되므로 사용할 수 없습니다.
3.2 Java 11 이상에서의 장기 해결 방법
Java 11부터는 관련 라이브러리를 외부에서 추가해야 합니다. 아래는 Maven, Gradle, 직접 JAR 파일 추가 방법을 제공합니다.
1. Maven 의존성 추가
pom.xml
파일에 다음 의존성을 추가합니다.
<dependencies>
<!-- JAXB API -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<!-- JAXB Runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
최신 버전:
버전 4.0.0 이상을 사용할 경우 패키지 이름이 javax.xml.bind
에서 jakarta.xml.bind
로 변경되었으므로 코드 수정이 필요합니다.
2. Gradle 의존성 추가
build.gradle
에 아래와 같이 추가합니다.
dependencies {
implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
implementation "org.glassfish.jaxb:jaxb-runtime:2.3.2"
}
3.3 JAR 파일 직접 추가
라이브러리를 다운로드하여 프로젝트에 포함할 수도 있습니다.
이후 실행 시 JAR 파일을 클래스 경로에 추가합니다.
java -cp "jaxb-api.jar:jaxb-runtime.jar:YourApplication.jar" YourMainClass
4. 추가 팁
1. 코드 수정 가이드
JAXB 패키지가 javax.xml.bind
에서 jakarta.xml.bind
로 변경되었으므로 코드에서 아래와 같이 수정이 필요합니다.
// Before (Java 8 이하)
import javax.xml.bind.JAXBContext;
// After (Java 11 이상)
import jakarta.xml.bind.JAXBContext;
2. JDK 옵션 확인
-XX:+IgnoreUnrecognizedVMOptions
를 사용하여 구 버전 JVM에서--add-modules
옵션을 무시하도록 설정할 수 있습니다.
5. 결론
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
는 Java 9 이상에서 흔히 발생하는 문제이며, 명령줄 옵션, 외부 라이브러리 추가, 코드 수정을 통해 효과적으로 해결할 수 있습니다.
이 가이드는 모든 주요 해결책을 제시하며, Java 버전에 따른 적절한 방법을 선택하여 적용할 수 있습니다.