У меня есть два приложения под tomcat/webapps
папка.
tomcat/webapps/App1
tomcat/webapps/App2
Оба приложения совместно используют те же библиотеки. Которые хранятся, например, в tomcat/webapps/App1/WEB-INF/lib
.
Обе библиотеки загружаются дважды в памяти?
Если я вставил эти общие библиотеки tomcat/server/lib
?
Как Вы видите здесь , Tomcat создает один загрузчик класса на веб-приложение на Вашем сервере. Таким образом, если у Вас будут webapp1 и webapp2, которые совместно используют ту же библиотеку, тогда эта библиотека будет действительно загружена дважды.
можно в конечном счете разместить эту библиотеку в общий каталог (tomcat-dir/common/lib), если это совместно используется весь веб-приложения, которые работают сервере Tomcat.
Я не рекомендовал бы поместить файлы банки в совместно используемую папку. Скажем, например то, что Вы должны в будущем развернуть приложение сторонних производителей, которое имеет более новую версию файла банки в папке WEB-INF. Для этого приложения классы банки будут загружены дважды (даже если у них будут те же имена), один от совместно используемой папки и один от папки веб-приложения. Эта ситуация может вызвать ошибки, очень трудные найти.
, Если файлы банки находятся в папках веб-приложения, то они загружаются отдельными загрузчиками класса и не вмешиваются друг в друга.
На основе опыта: эти два веб-приложения полностью изолируются друг от друга - библиотеки для, каждый не используется в другом - таким образом для ответа на начальный вопрос - да они были бы загружены дважды.
Для ответа на Вас второй вопрос необходимо ли развернуть эти библиотеки в общий каталог Tomcat - я сказал бы "нет", и здесь почему:
при развертывании библиотеки Jar в общий ресурс (кот/сервер/lib), тогда та версия библиотеки становится значением по умолчанию для всех веб-приложений, работающих под тем экземпляром Tomcat. Как Вы видите от этот обзор архитектуры кота , работы загрузчика класса "вниз цепочка", с папкой lib отдельного веб-приложения, являющейся последним местом, это посмотрит, прежде чем это выдаст class-not-found исключение. Это не верно в Tomcat 6 и Tomcat 7: любые классы в lib веб-приложений и папке классов будут быть разрешенными перед теми вместе, и таким образом, это не повредит другие приложения, которые развертывают все их банки в войне 2 .
проблема поэтому развертывания общей библиотеки к тому каталогу состоит в том, что это повреждает архитектуру для отдельных приложений, изолируемых друг от друга. Прекрасный в Вашем начальном примере, но если Вы хотите развернуть стороннее приложение (например, если Вы выполнение приложения, которое использует Портлет для обработки определенного содержания), Вы немедленно работаете в к проблемам зависимости от версии - Ваша общая версия библиотеки не может быть корректной для стороннего приложения, но потому что пакет уже загружается, Вы выдадите исключения оставленные право и центр.