JBoss Scoped类加载

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)

任何的想法 ?

ska*_*man 7

我扫描了该页面上的说明,它主要遵循我所拥有的相同步骤.关键的区别似乎在于他的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=falsehibernate.search.autoregister_listeners=false)禁用Search和Validator侦听器的注册,或者在EAR中打包兼容的Search and Validator版本.

  • '牦牛剃须'+1 - 我将开始使用它. (2认同)