Как добавить библиотеки /usr/share/java в путь к классам веб-приложения?

StackOverflow https://stackoverflow.com/questions/115203

Вопрос

Краткое содержание

Возможно ли, чтобы веб-приложения, развернутые на Linux + tomcat5.5, использовали/просматривали все /usr/share/java/ банки автоматически?

Подробности

Я упаковываю свое веб-приложение Java для Ubuntu (хотя вопрос касается любого дистрибутива на основе Linux) и собираюсь сделать его зависимым от Tomcat.

Я собираюсь поместить дескриптор контекста (файл XML) в /usr/share/tomcat5.5/conf/Catalina/localhost/ чтобы мое приложение было развернуто.Мой веб-каталог здесь: /usr/share/<appname>/web, как мне разрешить моему приложению использовать библиотеки Java jar, установленные в системе (/usr/share/java)?

Я не могу просто использовать символическую ссылку /usr/share/java -> <webdir>/WEB-INF/lib, поскольку у меня есть свои собственные банки, которые нужно поместить в lib реж.

Плохое решение

Решение, которое я нашел до сих пор, состоит в том, чтобы связать каждую необходимую банку с символической ссылкой на <webdir>/WEB-INF/lib/.

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

Это было полезно?

Решение

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

Это гарантирует, что ваше приложение будет вести себя одинаково, где бы вы его ни развернули, и вы не подвергнетесь неожиданным изменениям в версиях библиотек в /usr/share/java....

Другие советы

В соответствии с документация по загрузке классов Tomcat, вам необходимо поместить все общие библиотеки, которые должны быть доступны для всех приложений Tomcat, в библиотеку $CATALINA_BASE/shared/lib, поэтому один из способов сделать то, что вы хотите, — это переместить ваши библиотеки из /usr/share/ java в $CATALINA_BASE/shared/lib.

НО, если я не ошибаюсь в той же документации, Tomcat также делает содержимое общесистемной переменной CLASSPATH доступным для загрузчика классов при запуске, поэтому, если ваш каталог - /usr/share/java - был включен в общесистемный CLASSPATH переменная, то это тоже должно работать.Однако я никогда этого не делал;Метод Tomcat, позволяющий сделать содержимое $CATALINA_BASE/shared/lib доступным для всего Tomcat, всегда отлично служил мне.

Ответ Энцика привел меня к следующему решению.

Я собираюсь использовать модифицированное «плохое решение» (см. вопрос).

Модификации следующие:

  1. Зависит от конкретной версии пакета для всех зависимостей (влияет на «управляющий» файл при упаковке для deb)
    пример: libcommons-io-java (= 1.3.1) вместо того, чтобы просто libcommons-io-java
  2. Символическая ссылка на реальные файлы jar в `/usr/share/java`, а не на "обобщенные" файлы.
    пример:
    webdir/WEB-INF/lib/commons-io.jar -> /usr/share/java/commons-io-1.3.1.jar
    и не
    webdir/WEB-INF/lib/commons-io.jar -> /usr/share/java/commons-io.jar

Эти изменения гарантируют, что веб-приложение не сломается, если администратор установил новую версию библиотеки (например, common-io).

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

У вас есть два варианта: один — позволить загрузчику классов предоставлять библиотеки всем Java-программам, а другой — позволить загрузчику классов предоставлять библиотеки всем контекстам Tomcat.

Добавьте свои символические ссылки в /usr/lib/jvm/java-1.5.0-sun-1.5.0.11/jre/lib (обратите внимание, что вам может потребоваться указать другую версию в этом пути), чтобы разрешить всем Java-программам доступ к этим библиотекам или добавьте их в общие библиотеки Tomcat по адресу var/lib/tomcat5.5/shared/libs (опять же, номер версии может быть другим) для доступа ко всем контекстам Tomcat.

Я также должен отметить, что эти местоположения каталогов были взяты из Ubuntu «Feisty».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top