Часто разработчики сталкиваются с ситуацией, когда их код, использующий классы 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 и выше.
Перейти в телеграм, чтобы получить результаты теста



Забрать
Добавить комментарий