[Java] JDK9(Java SE 9) 이상에서 JAXB(javax.xml.bind) 클래스 못 찾음 문제

by 스뎅(thDeng) on

JAXB API 관련 클래스가 JDK9 부터는 SE에서 EE로 옮겨졌다. Java SE 11 등에서는 java.xml.bind 패키지에 있는 클래스를 사용하면 아래와 같은 에러를 볼 수 있다.

Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 40 more

해결 방법

실행 시에 --add-modules 옵션을 추가로 주면 된다.

--add-modules java.xml.bind

Java SE Javadoc을 보면 클래스 위에 module이 명시되어 있으니 이 모듈명을 적어주면 된다. https://docs.oracle.com/javase/9/docs/api/javax/xml/bind/JAXBContext.html

java.xml.bind javadoc

Deprecated Java EE 모듈

JAXB와 비슷하게 SOAP 같은 web service들도 별도의 모듈로 분리가 되어서 java.xml.ws 패키지를 사용할 때도 —add-modules java.xml.ws 옵션을 주어야 한다. 다음 목록들이 EE 모듈로 구분되어 제거될 예정이다. (JAXB나 JAX-WS처럼 Java SE 9에서 이미 제거된 모듈도 있다.)

java.activation (JAF)
java.corba (CORBA)
java.transaction (JTA)
java.xml.bind (JAXB)
java.xml.ws (JAX-WS)
java.xml.ws.annotation (Common Annotation)

모듈 Javadoc을 보면 @Deprecated(since="9", forRemoval=true)와 같이 forRemoval=true로 적혀 있다. 다음은 java.xml.bind 모듈의 Javadoc이다.

java.xml.bind module javadoc

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License