Рубрики
Без рубрики

Обработка NoClassDefFoundError для JAXBException в Java 9

Узнайте, как решить исключение JAXBException при переходе на Java 9.

Автор оригинала: baeldung.

1. введение

Для тех, кто пытался перейти на Java 9, они, вероятно, испытали что-то вроде NoClassDefFoundError при компиляции кода, который ранее работал в более ранних версиях Java.

В этой статье мы рассмотрим общий отсутствующий класс JAXBException и различные способы его решения. Представленные здесь решения, как правило, применимы к любому классу, который может отсутствовать при обновлении до Java 9.

2. Почему Java 9 Не Может найти исключение JAXBException?

Одной из наиболее обсуждаемых особенностей Java 9 является модульная система. Цель модульной системы Java 9 состоит в том, чтобы разбить основные классы JVM и связанные с ними проекты на отдельные модули . Это помогает нам создавать приложения с меньшими следами, включая только минимально необходимые классы для запуска.

Недостатком является то, что многие классы больше не доступны в пути к классам по умолчанию. В этом случае класс JAXBException можно найти в одном из новых модулей Jakarta EE с именем java.xml.bind . Поскольку этот модуль не требуется основной средой выполнения Java, по умолчанию он недоступен в пути к классам.

Попытка запустить приложение, использующее JAXBException , приведет к:

NoClassDefFoundError: javax/xml/bind/JAXBException

Чтобы обойти это мы должны включить javax.xml.bind модуль . Как мы увидим ниже, для этого существует несколько способов.

3. Краткосрочное Решение

Самый быстрый способ убедиться, что классы API JAXB доступны для приложения, –это добавить с помощью аргумента -add-modules командной строки :

--add-modules java.xml.bind

Однако это может быть не очень хорошим решением по нескольким причинам.

Во –первых, аргумент -add-modules также является новым в Java 9. Для приложений, которые должны работать на нескольких версиях Java, это создает некоторые проблемы. Нам придется поддерживать несколько наборов файлов сборки, по одному для каждой версии Java, на которой работает приложение.

Чтобы обойти это, мы также могли бы использовать аргумент командной строки -XX:+IgnoreUnrecognizedVMOptions для старых компиляторов Java.

Однако это означает, что любая опечатка или аргумент с ошибками не будут доведены до нашего сведения. Например, если мы попытаемся установить минимальный или максимальный размер кучи и неправильно введем имя аргумента, мы не получим предупреждения. Наше приложение все равно запустится, но оно будет работать с другой конфигурацией, чем мы ожидаем.

Во –вторых, опция -add-modules будет устаревшей в будущем выпуске Java. Это означает, что в какой-то момент после обновления до новой версии Java мы столкнемся с той же проблемой использования неизвестного аргумента командной строки и должны снова решить эту проблему.

4. Долгосрочное Решение

Существует лучший подход, который будет работать в разных версиях Java и не будет разрываться с будущими выпусками.

Решение состоит в том, чтобы использовать инструмент управления зависимостями, такой как Maven . При таком подходе мы бы добавили библиотеку API JAXB в качестве зависимости, как и любую другую библиотеку:


    javax.xml.bind
    jaxb-api
    2.3.0

Приведенная выше библиотека содержит только классы API JAXB, которые включают в себя JAXBException . В зависимости от приложения нам может потребоваться включить другие модули.

Также имейте в виду , что имена артефактов Maven могут отличаться от имени модуля Java 9 , как в случае с API JAXB. Его можно найти на Maven Central .

5. Заключение

Модульная система Java 9 обеспечивает ряд преимуществ, таких как уменьшение размера приложения и повышение производительности.

Однако это также приводит к некоторым непреднамеренным последствиям. При обновлении до Java 9 важно понять, какие модули действительно требуются приложению, и предпринять шаги, чтобы убедиться, что они доступны в пути к классам.