在JBoss AS 5中放置共享库的位置?
我是Jboss的新手,但我有多个web应用程序,每个都使用spring-hibernate和其他开源库和portlet,所以基本上现在每个war文件都包含那些jar文件。 如何将这些jar子移动到一个公共位置,这样我就不必将它们放在每个war文件中? 我猜位置是server/default/lib
,但我不确定。
另外,在WEB-INF/lib
与JBOSS/server/default/lib
放置这些jar有什么不同? 我会面对任何类加载器问题吗?
此外,我将静态数据存储在像Singleton
这样的静态字段中,是否会在所有WAR文件中共享这些数据?
类加载:
你是对的,把.jar
放到JBOSS/server/
或JBOSS/lib
。
JBoss AS附带了捆绑的Hibernate库,它们使用该AS版本进行测试。
请参阅jboss-6.0.0-SNAPSHOT\server\default\conf\jboss-service.xml
:
另见:
- http://community.jboss.org/wiki/classloadingconfiguration
- http://community.jboss.org/wiki/JbossClassLoadingUseCases
WEB-INF/lib
和JBOSS/server/default/lib
之间的区别:
WEB/lib
随WAR一起提供,并且只在该WAR中可见。 如果您有其他模块,例如EJB JAR,它们将无法从中看到它们,您将获得ClassNotFoundException
或(如果您在多个位置具有该类) ClassCastException
。
JBOSS-AS/server/
对于整个服务器是可见的,因此所有已部署的应用程序及其模块都可见。 但是(IIRC)它们没有优先权,所以如果你把这个lib放在一个WAR中,而不是在EJB jar中,你最终可能会使用两个不同的版本,这是不可取的(很可能导致前面提到的ClassCastException
)。
类加载行为可以通过几种方式进行调整,例如参见JBoss wiki 。
静态数据:
不要依赖Java EE中的静态字段,这会带来麻烦。 例如,。 同一个类可以由不同的类加载器加载,因此这些静态值将有多个实例。
如果要在更多WAR之间共享数据,请使用外部存储 – 数据库,文件(如果您写入,则为同步),JBoss Cache等。
JBOSS / server / default / lib工作正常。
该文件夹中的所有jar都将加载到JBoss中。
- 转到%JBOSS_HOME%\ server \ default \ conf目录
- 打开文件jboss-service.xml
-
在标签下你会发现
添加新的classpath标记,如下所示,以包含本地计算机上的sharedlib文件夹
注意:请确保将文件协议包含在代码库中