我在jboss上部署了两只耳朵,并配有适当的类加载器隔离设置。当seam bean调用spring bean对数据库进行一些查询时,一切正常,但是当调用spring quartz job bean并执行尝试执行数据库查询时,就会出现问题,因为spring尝试使用来自其他ear的hibernate jar并抛出异常!很明显春天的classloader隔离问题。有人遇到过这样的问题吗?如何确保隔离?
答案 0 :(得分:0)
我敢打赌,SEAM使用的Hibernate JAR来自JBOSS类加载器,它在任何EAR类加载器之前调用。发生这种情况是因为SEAM与JBOSS捆绑在一起。
EAR中的Spring正在使用不同版本的Hibernate JAR或其依赖项,因此您会遇到冲突。
你要么必须从JBOSS中删除Hibernate JAR,要么app server class loader不再可见,但这可能会破坏SEAM。
您可能会看到JBOSS是否有办法告诉应用服务器在EAR配置中更喜欢应用级JAR到服务器JAR。
答案 1 :(得分:0)
假设JBoss 4.x,然后在deploy/ear-deployer.xml
文件中,确保启用了类加载器隔离,例如
<server>
<mbean code="org.jboss.deployment.EARDeployer" name="jboss.j2ee:service=EARDeployer">
<attribute name="Isolated">true</attribute>
<attribute name="CallByValue">false</attribute>
<attribute name="EnablelibDirectoryByDefault">true</attribute>
</mbean>
</server>
这将阻止一个EAR中的类对另一个EAR可见。出于某种原因,默认设置为Isolation=false
。
这可能就足够了。但是,您可能还需要在EAR的jboss-app.xml
目录中添加META-INF
文件,其中包含以下内容:
<jboss-app>
<loader-repository>MyCompany:loader=MyApplication</loader-repository>
</jboss-app>
我不确定这是做什么或者用什么,但在某些情况下,它似乎加强了EAR之间的隔离。