Как добавить библиотеки /usr/share/java в путь к классам веб-приложения?
-
02-07-2019 - |
Вопрос
Краткое содержание
Возможно ли, чтобы веб-приложения, развернутые на 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, всегда отлично служил мне.
Ответ Энцика привел меня к следующему решению.
Я собираюсь использовать модифицированное «плохое решение» (см. вопрос).
Модификации следующие:
- Зависит от конкретной версии пакета для всех зависимостей (влияет на «управляющий» файл при упаковке для deb)
пример: libcommons-io-java (= 1.3.1) вместо того, чтобы просто libcommons-io-java - Символическая ссылка на реальные файлы 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».