Моя среда развертывания очень испорчена: jar-файлы разбросаны по всей системе, и я не могу это контролировать.Например, мое веб-приложение использует последнюю версию Javamail API, но, похоже, в $JAVA_HOME/jre/lib/ext
имеется несколько копий одной и той же библиотеки (очевидно, все более старые и разные версии).То же самое относится и к драйверам поставщиков баз данных, не говоря уже о $CATALINA_HOME/lib
. Я не могу ничего очистить , но, очевидно, мне нужно убедиться, что мое приложение получает минимально требуемую версию его зависимостей, поэтому я поместил все необходимые JAR-файлы в WEB-INF/lib
.Согласно спецификации сервлета и Tomcat docs :
Когда обрабатывается запрос на загрузку класса из загрузчика классов WebappX веб-приложения, этот загрузчик классов сначала просматривает локальные репозитории.вместо того, чтобы делегировать, прежде чем искать
, так что это должно решить мою проблему.Но тогда тот же самый документ говорит:
Следовательно, с точки зрения загрузки веб-приложений, классов или ресурсов выглядит в следующих репозиториях, в следующем порядке:
- Классы начальной загрузки вашей JVM
- Классы загрузчика системных классов (описанные выше)
- / WEB-INF / классы вашего веб-приложения
- / WEB-INF / lib / *.jar вашего веб-приложения
- Общие классы загрузчиков классов (описанные выше)
А на самом деле классы в /WEB-INF/lib
загружаются после системных,Это действительно ожидаемое поведение?Разве вы не находите, что документы Tomcat противоречивы?Знаете ли вы какой-нибудь контейнер сервлетов, который гарантирует, что я могу получить правильные зависимости?Как я могу решить эту проблему?