Tomcat загружает тот же файл библиотеки в память дважды, если они находятся в двух веб-приложениях?

У меня есть два приложения под tomcat/webapps папка.

tomcat/webapps/App1
tomcat/webapps/App2

Оба приложения совместно используют те же библиотеки. Которые хранятся, например, в tomcat/webapps/App1/WEB-INF/lib.

Обе библиотеки загружаются дважды в памяти?

Если я вставил эти общие библиотеки tomcat/server/lib?

50
задан Kevin Panko 1 February 2015 в 17:06
поделиться

3 ответа

Как Вы видите здесь , Tomcat создает один загрузчик класса на веб-приложение на Вашем сервере. Таким образом, если у Вас будут webapp1 и webapp2, которые совместно используют ту же библиотеку, тогда эта библиотека будет действительно загружена дважды.

можно в конечном счете разместить эту библиотеку в общий каталог (tomcat-dir/common/lib), если это совместно используется весь веб-приложения, которые работают сервере Tomcat.

39
ответ дан Romain Linsolas 7 November 2019 в 10:57
поделиться

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

, Если файлы банки находятся в папках веб-приложения, то они загружаются отдельными загрузчиками класса и не вмешиваются друг в друга.

29
ответ дан kgiannakakis 7 November 2019 в 10:57
поделиться

На основе опыта: эти два веб-приложения полностью изолируются друг от друга - библиотеки для, каждый не используется в другом - таким образом для ответа на начальный вопрос - да они были бы загружены дважды.

Для ответа на Вас второй вопрос необходимо ли развернуть эти библиотеки в общий каталог Tomcat - я сказал бы "нет", и здесь почему:

при развертывании библиотеки Jar в общий ресурс (кот/сервер/lib), тогда та версия библиотеки становится значением по умолчанию для всех веб-приложений, работающих под тем экземпляром Tomcat. Как Вы видите от этот обзор архитектуры кота , работы загрузчика класса "вниз цепочка", с папкой lib отдельного веб-приложения, являющейся последним местом, это посмотрит, прежде чем это выдаст class-not-found исключение. Это не верно в Tomcat 6 и Tomcat 7: любые классы в lib веб-приложений и папке классов будут быть разрешенными перед теми вместе, и таким образом, это не повредит другие приложения, которые развертывают все их банки в войне 2 .

проблема поэтому развертывания общей библиотеки к тому каталогу состоит в том, что это повреждает архитектуру для отдельных приложений, изолируемых друг от друга. Прекрасный в Вашем начальном примере, но если Вы хотите развернуть стороннее приложение (например, если Вы выполнение приложения, которое использует Портлет для обработки определенного содержания), Вы немедленно работаете в к проблемам зависимости от версии - Ваша общая версия библиотеки не может быть корректной для стороннего приложения, но потому что пакет уже загружается, Вы выдадите исключения оставленные право и центр.

8
ответ дан steve_ash 7 November 2019 в 10:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: