我是Jboss的新手,但我有多个web应用程序,每个都使用spring-hibernate和其他开源库和portlet,所以基本上现在每个war文件都包含那些jar文件。如何将这些罐子移动到一个公共位置,这样我就不必将它们放在每个war文件中?我猜位置是server/default/lib
,但我不确定。
此外,将这些广告素材放在WEB-INF/lib
与JBOSS/server/default/lib
之间有何不同?我会遇到任何类加载器问题吗?
此外,我将静态数据存储在静态字段中,如Singleton
,是否会在所有WAR文件中共享这些数据?
答案 0 :(得分:19)
<强>类加载:强>
你是对的,将.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>
另见:
WEB-INF/lib
与JBOSS/server/default/lib
之间的差异:
WEB/lib
中的Libs带有你的WAR,只能在那个WAR中看到。
如果你有其他模块,例如EJB JAR,它们将无法显示,您将获得ClassNotFoundException
或(如果您有多个地方的课程)ClassCastException
。
JBOSS-AS/server/<config>/lib
中的Libs对于整个服务器是可见的,因此所有部署的应用程序及其模块都可见。但是(IIRC)他们没有优先权,所以如果你带上这个例子,例如在WAR中,但在EJB jar中,最终可能会使用两个不同的版本,这是不可取的(可能导致上述ClassCastException
)。
类加载行为可以通过多种方式进行调整,例如, JBoss wiki
静态数据:
不要依赖Java EE中的静态字段,这会带来麻烦。例如,。同一个类可以由不同的类加载器加载,因此这些静态值会有多个实例 如果要在更多WAR之间共享数据,请使用外部存储 - 数据库,文件(如果您写入,则为同步),JBoss Cache等。
答案 1 :(得分:2)
答案 2 :(得分:0)
JBOSS / server / default / lib工作正常。
该文件夹中的所有jar都将加载到JBoss中。
答案 3 :(得分:0)
在标记下,您会找到
添加一个新的classpath标记,如下所示,以包含本地计算机上的sharedlib文件夹
注意:请确保将文件协议包含在代码库
中