Есть ли причины помещать зависимость в каталог lib веб-сервера вместо того, чтобы включать ее в файл War?

Если у меня есть Jar-файл зависимостей для моего приложения, лучше ли поместить его в каталог lib военных файлов или в каталог lib глобального сервера приложений (например, Tomcat)? Что я выиграю, если буду использовать один подход по сравнению с другим?

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


person James McMahon    schedule 17.09.2009    source источник


Ответы (3)


Вообще говоря, гораздо лучше, чтобы WAR была автономной, поэтому вам не нужно полагаться на конфигурацию контейнера. Это также значительно упрощает развертывание. Так что попробуйте поместить библиотеку в WAR, если сможете.

Однако я сталкивался со случаями, когда установка библиотек в контейнер имеет смысл. Например,

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

  2. Библиотеки, установленные в WEB-INF / lib, недоступны для контейнера. Если вам нужно сослаться на них в context.xml (например, на драйвер JDBC, определенный в Ресурсах), вы должны поместить их в server / lib.

  3. Если вы хотите отправлять журналы log4j из всех веб-приложений в один и тот же файл, вам нужно поместить log4j jar в server / lib. В противном случае каждое веб-приложение использует свой собственный регистратор.

person ZZ Coder    schedule 17.09.2009
comment
По пункту 3 верно обратное? Я помещаю log4j в серверы / lib, потому что все его используют, но я не хочу, чтобы все помещалось в один и тот же файл. Есть ли способ обойти это? - person James McMahon; 17.09.2009
comment
да. См. Мой ответ на этот вопрос: stackoverflow.com/questions/1332691/ - person ZZ Coder; 17.09.2009

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

В противном случае вы, вероятно, не захотите устанавливать их в каталог server / lib и предполагать, что они там есть и будут работать, поскольку разные веб-приложения могут иметь слегка разные требования к версии.

person Steven Huwig    schedule 17.09.2009

Для более подробного описания иерархии загрузчика классов, реализованной Catalina, вы должны проверить Tomcat РУКОВОДСТВО ПО загрузчикам классов. Это поможет вам понять, когда сделать jar-файлы доступными для контейнера, для всех веб-приложений, только для одного веб-приложения ... и где их разместить.

person Pascal Thivent    schedule 17.09.2009