Подтвердить что ты не робот

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

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

tomcat/webapps/App1
tomcat/webapps/App2

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

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

Должен ли я поместить эти общие библиотеки в tomcat/server/lib?

4b9b3361

Ответ 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 может кто-нибудь поделиться об этом в деталях