Где разместить общую библиотеку в JBoss AS 5?
Я новичок в Jboss, но у меня есть несколько веб-приложений, каждое из которых использует Spring-Hibernate и другие библиотеки с открытым исходным кодом и портлеты, поэтому в настоящее время каждый военный файл включает в себя эти JAR-файлы. Как мне переместить эти банки в обычное место, чтобы мне не нужно было помещать их в каждый файл войны? Я думаю, что местоположение server/default/lib
, но я не уверен.
Кроме того, как это отличается, чтобы эти банки в WEB-INF/lib
против JBOSS/server/default/lib
? Буду ли я сталкиваться с какой-либо проблемой загрузчика классов?
Также у меня есть статические данные, хранящиеся в статических полях, таких как Singleton
будут ли они распространяться на все файлы WAR?
4 ответа
загрузки классов:
Вы правы, поставьте .jar
с JBOSS/server/<configuration>/lib
, или же JBOSS/lib
,
JBoss AS поставляется в комплекте с библиотеками Hibernate, которые протестированы с этой версией AS.
Увидеть jboss-6.0.0-SNAPSHOT\server\default\conf\jboss-service.xml
:
<server>
<!-- Load all jars from the JBOSS_HOME/server/<config>/lib directory and
the shared JBOSS_HOME/common/lib directory. This can be restricted to
specific jars by specifying them in the archives attribute.
TODO: Move this configuration elsewhere
-->
<classpath codebase="${jboss.server.lib.url}" archives="*"/>
<classpath codebase="${jboss.common.lib.url}" archives="*"/>
</server>
Также см:
- http://community.jboss.org/wiki/classloadingconfiguration
- http://community.jboss.org/wiki/JbossClassLoadingUseCases
Разница между WEB-INF/lib
а также JBOSS/server/default/lib
:
Libs в WEB/lib
прийти с вашей WAR и видны только в этой WAR. Если у вас есть другой модуль, например, EJB JAR, они не будут видны из него, и вы получите ClassNotFoundException
или (если у вас есть класс в нескольких местах) ClassCastException
,
Libs в JBOSS-AS/server/<config>/lib
видны для всего сервера, таким образом, все развернутые приложения и их модули. Однако (IIRC) они не имеют приоритета, поэтому, если вы приведете эту библиотеку, например, в WAR, но не в EJB jar, вы можете использовать две разные версии, что нежелательно (вероятно, приведет к вышеупомянутому ClassCastException
).
Поведение загрузки классов может быть изменено несколькими способами, см., Например, вики JBoss.
Статические данные:
Не полагайтесь на статические поля в Java EE, это вызывает проблемы. Например,. один и тот же класс может быть загружен разными загрузчиками классов, поэтому будет несколько экземпляров этих статических значений.
Если вы хотите обмениваться данными между несколькими WAR-файлами, используйте внешнее хранилище - базу данных, файл (с синхронизацией, если вы пишете в него), JBoss Cache и т. Д.
JBOSS/server/default/lib работает нормально.
Все банки в этой папке будут загружены в JBoss.
- Перейдите в каталог%JBOSS_HOME%\server\default\conf
- Открыть файл jboss-service.xml
Под тегом вы найдете
Добавьте новый тег classpath, как показано ниже, чтобы включить папку sharedlib на локальном компьютере.
Примечание: пожалуйста, не забудьте включить протокол файла в базу кода