Получение ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException при вызове анализатора JSON JSON из сервлета - PullRequest
0 голосов
/ 04 июля 2018

У меня есть сервлет, работающий на Tomcat 8, который вызывает статический метод для выполнения анализа JSON с Jackson 2.9.6.

Во время выполнения кода:

JSONData parsedJSONData = PDFGenerator.parseJSONDocument(jsonDocument);

Я получаю:

java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException

Важно отметить, что класс сервлета и класс PDFGenerator находятся в разных пакетах, но с public модификаторами доступа.

Я пытался добавить зависимости в корень проекта через pom.xml :

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.6</version>
</dependency>

но это не помогает.

В моем проекте я не использую Maven, просто добавил необходимые библиотеки через classpath.

Странно то, что такое исключение появляется только тогда, когда я пытаюсь вызвать PDFGenerator.parseJSONDocument(jsonDocument) из сервлета, выполнение из обычного Java-класса работает плавно.

Мой вопрос:
Что и где я должен добавить, чтобы иметь возможность вызывать статический метод с функциональностью анализатора JSON на основе библиотеки JSON FasterXML / Jackson?

1 Ответ

0 голосов
/ 04 июля 2018

Эта проблема почти наверняка вызвана тем, что загрузчики классов в вашем контейнере сервлета (Tomcat 8.x) не могут найти библиотеку / JAR для Джексона. То, как классы / библиотеки загружаются в контейнеры сервлетов, отличается от стандартного объявления пути к классам в автономном приложении Java. Вот почему вы видите ошибку от движка сервлета, но не во время прямого выполнения класса. Вот общая документация о том, как Tomcat 8.x обрабатывает загрузку классов:

https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Как правило, для предотвращения подобных проблем, во-первых, рекомендуется развертывать ваши сервлеты в контейнере "веб-приложения", включающем все необходимые библиотеки (соответствующие версии требуемых JAR-файлов и т. Д.). Это изолирует ваши сервлеты от одного загрузчика классов и автоматически найдет их в правильной иерархии. Смотрите эту часть связанной документации:

WebappX - Загрузчик классов создается для каждого веб-приложения, развертываемого в одном экземпляре Tomcat. Все распакованные классы и ресурсы в каталоге / WEB-INF / classes вашего веб-приложения, а также классы и ресурсы в файлах JAR в каталоге / WEB-INF / lib вашего веб-приложения, становятся видимыми для этого веб-приложения, но не другим.

К вашему сведению, существуют другие способы сделать это с веб-приложениями корпоративного класса, но мы не будем говорить об этом здесь.

...