Подобная проблема обычно означает, что у вас есть зависимость от вашего пути к классу, который слишком стар.Это может произойти при использовании такого инструмента, как Maven, потому что он имеет концепцию транзитивных зависимостей , что означает, что зависимости извлекаются, потому что другая зависимость диктует, что они вам нужны.Это удобно ... и подвержено ошибкам.
Из трассировки стека исключений совершенно ясно, что это связано с классом сервлета, что подразумевает, что это - сервлет-api.jar (поиск в Google дляимя класса, как правило, является простым способом выяснить, из чего состоит jar-класс, если вы случайно не знаете его по опыту).
Зная, какой это jar-файл, вы можете выполнить команду maven
mvn dependency:tree
, чтобы Maven генерировал список всех зависимостей, их версий и областей действия.Просматривая это, вы можете найти, где находится этот jar-файл.
Так что в этом случае, как упоминалось в комментариях, инструмент скоростных зависимостей вытягивал сервлет-API, и это была более старая версия (версия 2.3Я собираюсь угадать, посмотрев на pom этой зависимости ).Зная это, вы можете предпринять несколько основных шагов, чтобы исправить ситуацию.Вот три, которые я обычно применяю, и одна - плохая идея.
1.Удалите оскорбительную зависимость (в нашем случае скоростные инструменты)
Это актуально только в том случае, если вам, конечно, эта зависимость не нужна.Это действительно так чаще, чем должно быть, когда дело доходит до мавеновских помпонов, нам всем нравится слишком небрежно копировать / вставлять.
2.Обновите зависимость
Возможно, нужна корневая зависимость, но все еще используется очень старая версия.Проблемы с зависимостями могут быть решены в более новых обновлениях (что также, по-видимому, относится к инструментам speed).Исторически, зависимости в maven central не уделяли слишком много внимания объявлению правильных областей действия для их транзитивных зависимостей и могли наложить гораздо больше зависимостей в область компиляции, чем это было на самом деле необходимо.Это значительно улучшилось в последние годы, но вы все еще можете столкнуться с проблемами при включении очень старых версий зависимостей.
3.Объявите правильную версию и область действия переходной зависимости самостоятельно
Скажите, что сервлет-api загружается в область компиляции - это неправильно .Servlet-api никогда не должен развертываться вместе с вашим приложением, сервер (Tomcat) предоставляет его.Это зависимость, цель которой буквально только для того, чтобы вы могли скомпилировать код с использованием API сервлета.
Так что если вы оказались в ситуации, когда зависимость должна быть включена для компиляции, но исключена из развертывания, вы можетеуправляйте им самостоятельно в поме (или в помете вашего родителя), которая будет иметь приоритет.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
4.Добавить исключение (не рекомендуется)
Если вам действительно нужна корневая зависимость, возможно, что транзитивная зависимость, которую вы извлекаете, в данном случае servlet-api, не относится к вашему коду ввсе.В этом случае вы можете добавить исключение.
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>1.3</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Исключения должны быть последним средством, поскольку их трудно поддерживать;они по сути взломать.Добавление исключения к одной зависимости не гарантирует, что зависимость исчезнет, потому что она может быть извлечена и где-то еще.По возможности управляйте зависимостями с помощью одного из трех других вариантов, старайтесь избегать работы с исключениями.