Jer*_*ese 3 jboss hibernate 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)
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
我扫描了该页面上的说明,它主要遵循我所拥有的相同步骤.关键的区别似乎在于他的jboss-app.xml文件内容:
<jboss-app>
<loader-repository>
org.myapp:loader=SomeClassloader
<loader-repository-config>
java2ParentDelegation=false
</loader-repository-config>
</loader-repository>
</jboss-app>
Run Code Online (Sandbox Code Playgroud)
我的系统不会禁用父委派,它只有加载程序名称:
<jboss-app>
<loader-repository>org.myapp:loader=MyAppName</loader-repository>
</jboss-app>
Run Code Online (Sandbox Code Playgroud)
您可能(或可能不)也需要在JBoss的deploy/ear-deployer.xml文件中设置Isolated = true属性:
这很好用.通过禁用父委派,您将削弱应用程序以任何方式与容器交互的能力,这有点极端.但是,如果省略该选项,则需要进行一些牦牛剃须
通过省略该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=false和hibernate.search.autoregister_listeners=false)禁用Search和Validator侦听器的注册,或者在EAR中打包兼容的Search and Validator版本.