#java #maven #tomcat #classpath #noclassdeffounderror
#java #maven #tomcat #путь к классам #ошибка noclassdeffounderror
Вопрос:
Я работаю с Maven и Tomcat. Некоторые веб-приложения, которые я должен развернуть, используют множество зависимостей, которые отмечены как «предоставленные» в Maven. Одним из примеров таких зависимостей является spring-context.
Итак, когда я упаковываю проект, эти зависимости не включаются в папку lib файла WAR. Из-за этого я получаю
NoClassDefFoundError: org/springframework/context/ApplicationContext
Я не могу изменить область зависимостей, и, если возможно, я не хочу включать банки зависимостей в файл WAR.
Как я могу добавить репозиторий Maven в качестве пути к классу в Tomcat, чтобы он мог разрешить все «предоставленные» зависимости? Без копирования JAR-файлов в папку библиотеки Tomcat.
Я попробовал свойство shared.loader в catalina.properties, но оно не работает рекурсивно: я должен добавить каждый путь к JAR к значению свойства.
Комментарии:
1.
mvn -Dmdep.outputFile=FILE dependency:build-classpath
запишет полные пути ко всем зависимостямFILE
в формате, подходящем дляjava -cp
. Вам должно быть легко разложить эту строку и скопировать зависимости в общий каталог библиотеки Tomcat. ОСТЕРЕГАЙТЕСЬ , однако, что вы попадете в ад пути к классам, если сделаете это (вот почему я не опубликовал ответ; это было бы справедливо отклонено до забвения).
Ответ №1:
Зависимость помечается как предоставленная, когда она уже есть на сервере приложений или в контейнере, и вам не нужно помещать ее в war. Это имеет место, т. Е. для jar сервлетов, но не для spring-context. Я думаю, что лучшим решением было бы пометить эти зависимости как «скомпилированные» вместо «предоставленные».
Комментарии:
1. Да, это был бы лучший вариант. Проблема в том, что я не могу изменить область действия зависимостей. Устаревшие проекты — это заноза в заднице.
2. Вы можете переупаковать и повторно развернуть проект, но вы не можете изменить область действия зависимостей, потому что они являются «устаревшими» проектами? Теперь мне любопытно…
3. Вероятно, я неправильно использовал термин «наследие». Дело не в том, что я «не могу». Дело в том, что из-за некоторых странных требований команды мне «не разрешено» изменять область видимости.
Ответ №2:
Здесь у вас есть несколько вариантов. Как сказал @Andres, вы либо добавляете банки в WAR, либо добавляете их в путь к классам Tomcat (т. Е. В папку lib).
Хотя концепция наличия загрузчика классов с поддержкой Maven интересна, представьте все возможные конфликты версий jar, которые могут возникнуть. Война A с предоставленной зависимостью от библиотеки v1.0.1 и война B с предоставленной зависимостью от библиотеки v2.1.0, при этом Tomcat автоматически разрешает их…