2009-07-21 9 views
3

Ich möchte die neueste Hibernate-Version im Ohr verwenden, ohne die Jars auf dem Server zu aktualisieren. Ich befolge die hier gegebenen Anweisungen - http://jaitechwriteups.blogspot.com/2008/08/how-to-upgrade-hibernate-in-jboss.html.JBoss Scoped Class Loading

Allerdings ist das Problem jetzt die Anwendung nimmt nicht die jboss-local-jdbc.rar sitzt im Deployment-Ordner.

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 [email protected]{ 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) 

Irgendeine Idee?

Antwort

7

Ich hatte einen Scan durch die Anweisungen auf dieser Seite, und es folgt meist die gleichen Schritte, die ich habe. Der entscheidende Unterschied scheint in den Inhalt seiner jboss-app.xml Datei zu sein:

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

Mein System nicht Mutter Delegation nicht deaktiviert, es hat nur den Lader Name:

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

Sie kann (oder auch nicht) muss auch das Isolated = True-Attribut in JBoss deploy/ear-deployer.xml Datei:

Und das funktioniert gut. Durch das Deaktivieren der übergeordneten Delegierung können Sie die Fähigkeit Ihrer Anwendung, mit dem Container zu interagieren, in irgendeiner Weise lahmlegen, was ein bisschen extrem ist. Wenn Sie diese Option weglassen, aber ein bisschen yak shaving erforderlich ist

Durch Weglassen der java2ParentDelegation=false Option, erhalten Sie eine Situation, in der alle Klassen in Ihrer EAR, die den gleichen Namen haben wie Klassen in JBoss bevorzugt geladen wird von das Ohr (was gut ist). Alle Klassen, die nicht in der EAR gefunden wurden, werden jedoch in die JBoss-Bibliotheken übertragen. Im Fall von jboss-local-jdbc.rar ist das gut. Es kann jedoch besondere Nebenwirkungen haben.

Wenn Hibernate beispielsweise eine Sitzungsfactory erstellt, sucht es nach den Bibliotheken Hibernate Search und Hibernate Validator und versucht, diese ebenfalls zu starten. Wenn diese in Ihrer EAR nicht vorhanden sind, werden sie in den JBoss-Bibliotheken gefunden. Das Problem ist, dass Sie oft einen Linker-Fehler erhalten, weil die Versionen von Search und Validator, die mit JBoss ausgeliefert werden, möglicherweise nicht mit dem in Ihrem EAR verpackten Hibernate kompatibel sind. Die Lösung besteht darin, entweder die Hibernate-Sitzungsfactory so zu konfigurieren, dass die Registrierung von Such- und Validator-Listener mithilfe der Konfigurationseigenschaften (hibernate.validator.autoregister_listeners=false und hibernate.search.autoregister_listeners=false) deaktiviert wird, oder kompatible Versionen von Search und Validator in Ihre EAR zu packen.

+2

+1 für 'Yak Rasieren' - Ich werde anfangen, das zu verwenden. –

+0

Laut jboss docs ist java2ParentDelegation = false der Standardwert. Wie erklären Sie sich dann, dass dies Auswirkungen auf Ihre Bereitstellung hat? – cmcginty

-1

Warum entfernen Sie nicht einfach die Hibernate-Jars auf dem Jboss-Anwendungsserver?

+1

Jerrish erwähnte, dass er die mit dem Anwendungsserver gelieferten Jars nicht aktualisieren oder ändern wollte. – avernet

1

Jerrish,

Sie scheinen ein Glas zu Verpackungen mit javax.management. * Klassen in Ihrer Anwendung Verpackung. Entfernen Sie dieses Glas aus der Anwendungsverpackung (da es bereits in JBoss AS geliefert wird).