JBoss Scoped类加载

时间:2009-07-21 04:29:45

标签: hibernate jboss classloader

我想在耳内使用最新的hibernate版本,而无需升级服务器上的jar。我按照此处给出的说明进行操作 - http://jaitechwriteups.blogspot.com/2008/08/how-to-upgrade-hibernate-in-jboss.html

但是现在问题是应用程序没有把jboss-local-jdbc.rar放在deploy文件夹中。

2009-07-21 09:01:50,347 INFO  [org.jboss.system.ServiceConfigurator] Problem configuring service jboss.jca:service=DataSourceBinding,name=MockDS
org.jboss.deployment.DeploymentException: Exception setting attribute ConnectionManager = jboss.jca:service=LocalTxCM,name=MockDS on mbean jboss.jca:service=DataSourceBinding,name=MockDS; - nested throwable: (javax.management.InvalidAttributeValueException: Set attribute  has class class javax.management.ObjectName loaded from null that is not assignable to attribute class class javax.management.ObjectName loaded from org.jboss.mx.loading.UnifiedClassLoader3@1babddb{ url=file:/C:/servers/jboss-4.2.2.GA/server/default/tmp/deploy/tmp22267hibernate_upgrade_test.ear ,addedOrder=43})
    at org.jboss.system.ServiceConfigurator.setAttribute(ServiceConfigurator.java:707)
    at org.jboss.system.ServiceConfigurator.configure(ServiceConfigurator.java:382)
    at org.jboss.system.ServiceConfigurator.internalInstall(ServiceConfigurator.java:462)
    at org.jboss.system.ServiceConfigurator.install(ServiceConfigurator.java:171)
    at org.jboss.system.ServiceController.install(ServiceController.java:226)
    at sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

有什么想法吗?

4 个答案:

答案 0 :(得分:7)

我扫描了该页面上的说明,它主要遵循我所拥有的相同步骤。关键区别似乎在于他的jboss-app.xml文件的内容:

<jboss-app>
 <loader-repository>
   org.myapp:loader=SomeClassloader
   <loader-repository-config>
      java2ParentDelegation=false
   </loader-repository-config>
 </loader-repository> 
</jboss-app>

我的系统不会禁用父委派,它只有加载程序名称:

<jboss-app>
 <loader-repository>org.myapp:loader=MyAppName</loader-repository> 
</jboss-app>

您可能(或可能不)也需要在JBoss的deploy/ear-deployer.xml文件中设置Isolated = true属性:

这很好用。通过禁用父委派,您将削弱应用程序以任何方式与容器交互的能力,这有点极端。但是,如果省略该选项,则需要yak shaving一点

通过省略java2ParentDelegation=false选项,您会遇到这样的情况,即您的EAR中与JBoss中的类名相同的任何类将优先从EAR加载(这很好)。但是,在EAR中找不到的任何类都将落到JBoss的库中。在jboss-local-jdbc.rar的情况下,这很好。但是,它可能会产生特殊的副作用。

例如,当Hibernate创建会话工厂时,它会查找Hibernate Search和Hibernate Validator库,并尝试启动它们。如果你的EAR中没有这些,它会在JBoss的libs中找到它们。问题是您经常会遇到链接器错误,因为JBoss附带的Search and Validator版本可能与您EAR中打包的Hibernate不兼容。

解决方案是配置Hibernate会话工厂以使用配置属性(hibernate.validator.autoregister_listeners=falsehibernate.search.autoregister_listeners=false)禁用Search and Validator侦听器的注册,或者打包兼容的Search and Validator版本你的EAR也是。

答案 1 :(得分:1)

Jerrish,

您似乎在应用程序打包中打包了一个包含javax.management。*类的jar。从应用程序包中删除该jar(因为它已经在JBoss AS中发布)。

答案 2 :(得分:0)

我正在使用专用于类加载的jboss-classloading.xml文件。对我来说,语法比jboss-app.xml语法更自然。有关详细说明,请参阅http://phytodata.wordpress.com/2010/10/21/demystifying-the-jboss5-jboss-classloading-xml-file/

答案 3 :(得分:-1)

为什么不直接删除jboss应用服务器上的hibernate jar?