Часто разработчики сталкиваются с ситуацией, когда их код, использующий классы JAXB API, которые были предоставлены как часть JDK в Java 6/7/8, при запуске на Java 9 вызывает ошибки. Это происходит из-за того, что указанные классы не могут быть найдены.
Примером такого кода может быть следующий фрагмент:
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; public class Main { public static void main(String[] args) { try { JAXBContext jaxbContext = JAXBContext.newInstance(Object.class); } catch (JAXBException e) { e.printStackTrace(); } } }
При запуске данного кода с JDK 9 и выше произойдет ошибка java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
.
Причина такого поведения заключается в том, что начиная с Java 9, некоторые модули, включая JAXB, были удалены из JDK. Это было сделано в целях уменьшения размера JDK и JRE.
Для решения этой проблемы, можно использовать один из следующих подходов:
-
Добавление нужных модулей в runtime с использованием флага
--add-modules
. В этом случае в командной строке для запуска программы будет выглядеть следующим образом:java --add-modules java.xml.bind Main
. -
Использование зависимостей JAXB из Maven. Для этого в файл
pom.xml
необходимо добавить следующую зависимость:
<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency>
После этого классы JAXB будут доступны для использования, так как они будут загружены из зависимостей Maven.
Оба этих подхода позволят избежать ошибки java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
при запуске программы на JDK 9 и выше.
Добавить комментарий