Добавить репозиторий Maven в путь к классам Tomcat

#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 автоматически разрешает их…