Загружает ли Tomcat один и тот же файл библиотеки в память дважды, если они находятся в двух веб-приложениях?
У меня есть два приложения в папке tomcat/webapps
.
tomcat/webapps/App1
tomcat/webapps/App2
Оба приложения имеют одни и те же библиотеки. Которые хранятся, например, в tomcat/webapps/App1/WEB-INF/lib
.
Обе библиотеки загружаются дважды в память?
Должен ли я поместить эти общие библиотеки в tomcat/server/lib
?
Ответы
Ответ 1
Как вы можете видеть здесь, Tomcat создает на вашем сервере один загрузчик классов на webapp.
Таким образом, если у вас есть webapp1 и webapp2, которые используют одну и ту же библиотеку, тогда эта библиотека будет загружена дважды.
В конечном итоге вы можете поместить эту библиотеку в общий каталог (tomcat-dir/common/lib), если он используется all webapps, которые запускаются на вашем сервере Tomcat.
Ответ 2
Я бы не рекомендовал размещать файлы jar в общей папке. Например, скажем, что вам нужно в будущем развернуть стороннее приложение, имеющее более новую версию файла jar в папке WEB-INF. Для этого приложения классы jar будут загружаться дважды (даже если они имеют одинаковые имена), один из общей папки и один из папки веб-приложения. Эта ситуация может привести к очень сложным ошибкам.
Если файлы jar находятся в папках веб-приложений, они загружаются отдельными загрузчиками классов и не мешают друг другу.
Ответ 3
Из опыта: два веб-приложения полностью изолированы друг от друга - библиотеки для одного не используются в другом - таким образом, чтобы ответить на ваш первоначальный вопрос - да, они будут загружены дважды.
Чтобы ответить на второй вопрос, следует ли разворачивать эти библиотеки в общий каталог Tomcat - я бы сказал нет, и вот почему:
Если вы разворачиваете библиотеку Jar в общую папку (tomcat/server/lib), то эта версия библиотеки становится стандартной для всех веб-приложений, работающих под этим экземпляром Tomcat. Как вы можете видеть из этого обзора архитектуры tomcat, класс-загрузчик работает "вниз по цепочке", с отдельной папкой веб-приложения lib будучи последним, где он будет выглядеть до того, как он выберет исключение класса, не найденное. Это не относится к Tomcat 6 и Tomcat 7: любые классы в папке lib и classes веб-приложений будут разрешены до их общего, и, таким образом, это не сломает другие приложения, которые развертывают все свои банки в войне 2.
Поэтому проблема развертывания разделяемой библиотеки в этом каталоге заключается в том, что она разрушает архитектуру для изолирования отдельных приложений друг от друга. В вашем первоначальном примере будет отлично, но если вы хотите развернуть стороннее приложение (например, если вы используете приложение, которое использует портлет для обработки определенного содержимого), вы мгновенно запускаете проблемы с зависимостью от версии - ваша общая версия библиотеки может не корректно для стороннего приложения, но поскольку пакет уже загружен, вы будете бросать исключения влево и вправо.
Ответ 4
Мы используем tomcat6 и находим хороший способ снабдить tomcat с помощью общих библиотек, которые нужны всем нашим веб-клиентам.
Изменить conf/catalina.properties запись common.loader. Например. добавьте дополнительную папку с баночками, которым вы хотите поделиться "mylibs"
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,
${catalina.home}/lib,${catalina.home}/lib/*.jar,
{catalina.home}/mylibs/*.jar
Затем поместите все общие библиотеки. Готово.
Почему мы начали использовать папку mylibs вместо WEB-INF/lib во всех файлах webapps (WAR)?
Развертывание стало кошмаром после того, как WAR пересекла линию 50 МБ!
Когда вы используете webapp с версией никогда не jar, вы можете поместить его в WEB-INF/lib, чтобы перезаписать то, что у вас есть в mylibs.
Ответ 5
Если вы не хотите, чтобы ваши библиотеки загружались дважды, добавьте их:
- Tomcat 6:
$CATALINA_HOME/lib
- Tomcat 5:
$CATALINA_HOME/common/lib
(удаляется из вопроса и копируется здесь, чтобы его можно было проголосовать/прокомментировать)
Ответ 6
PermGen Пространство кучи используется для хранения классов и метаданных о классах в Java.
Ошибка java.lang.OutOfMemoryError: пространство PermGen может часто возникать, потому что мы загружаем много дублирующейся библиотеки в apache tomcat
может кто-нибудь поделиться об этом в деталях