2009-07-16 30 views
1

我有几个单独的应用程序项目(EAR)和多个我想要部署到同一个JBoss服务器的EJB。现在,一些项目可能具有相同的EJB,但版本不同。在类似情况下,某些项目可能会使用不同版本的相同“普通”类(即在VM中加载的类,而无需JNDI查找)。使用OC4J,这看起来没有问题,但现在在JBoss中,我得到的印象是,所有东西都驻留在同一个“名称空间”(或类加载器)中。我在这个假设中纠正了吗?将同一个EJB和类的多个版本部署到同一个JBoss服务器

基本上,我想要做的(或保证)两件事情:

  • 从客户端,做一个EJB的JNDI的查找,我希望能够以表明它位于哪个应用程序in,以便返回正确版本的EJB。

  • 从EJB内部,当实例化一个类时,我想确保该类是与EJB相同的应用程序(EAR)部署的类。

我想我读过你可以为EJB配置一些“隔离”属性,我猜对了,这可能会解决我的第二点?

回答

2

你是正确的,来自不同EAR的类位于同一个“空间”。 JBoss默认使用平面类加载器层次结构,这意味着所有类(WAR包装器除外)都由同一个类加载器加载。随着JBoss 5的推出,新的标准配置文件严格遵循Java EE规则,因此支持隔离类加载。较早的JBoss版本也支持通过部署器配置中的callByValue隔离属性的行为。

5

JBoss的默认行为是使用平面类加载器。这样可以减少占用空间,但正如您发现的那样,这使部署多个应用程序变得很麻烦。

谢天谢地,修复很简单。在ear-deployer.xml文件中deploy目录,请确保以下参数设置:

<attribute name="Isolated">true</attribute> 

这会给每个部署的EAR自己的类加载器的空间。它仍然能够从JBoss lib目录访问东西,但部署的EAR将彼此不可见。

+0

感谢您的回复!我最终选择Kettelerijs的答复作为接受的答案,但您的答复也非常有用。 – Brummo 2009-07-23 08:22:36

相关问题