Ich versuche eine WAR-Datei innerhalb eines Karaf OSGi-Containers laufen zu lassen. Die Anwendung läuft im eigenständigen Jetty 6.1.26 korrekt, aber wenn die Anwendung innerhalb von Karaf ausgeführt wird, bekomme ich die folgende Ausnahme und die Karaf-Instanz friert ein:
%Vor%Beachten Sie, dass die Anwendung nicht auf Hibernate in einem separaten OSGi-Bundle angewiesen ist. Es enthält die Hibernate-Jars in WEB-INF / lib.
Ich habe die Informationen zu diesem Beitrag untersucht: Equinox (OSGi) und JPA / Ruhezustand - Entitäten suchen . Die Anwendung verwendet jedoch JPA anstatt Hibernate direkt zu verwenden. Die Konfiguration der Anwendung ähnelt der zweiten Option in diesem Beitrag: Unterschied zwischen der Konfiguration der Datenquelle in der Datei persistence.xml und in den Frühlingskonfigurationen . Daher habe ich kein Handle für eine Hibernate SessionFactory, mit der ich die annotatedClasses-Eigenschaft festlegen kann.
Irgendwelche Ideen, wie man über die Ausnahme hinwegkommt?
Ich habe parallel mit dem Autor gearbeitet und werde unsere Lösung hier für alle veröffentlichen, die in Zukunft darauf stoßen.
Die Exception wird ausgelöst, weil Hibernate versucht, das jar-Objekt zu entpacken, um nach den Persistenzklassen zu suchen. Wie in anderen Beiträgen erwähnt, lässt OSGi nicht zu, dass Hibernate wie ein Klassenlader agiert. Dies schlägt fehl. Die Lösung gab alle Klassen an, die manuell geladen werden mussten, und forderte dann auf, nichts anderes zu laden.
Wir haben eine persistence.xml
-Datei und eine orm.xml
-Datei verwendet (wir haben Standardnamen verwendet, so dass wir sie nicht in unserem applicationContext.xml
angeben mussten).
Unsere persistence.xml
-Datei zeigte einfach mit dem orm.xml
-Tag auf <mapping-file>
. Es enthielt auch das <exclude-unlisted-classes/>
-Tag, damit Hibernate nicht versucht, zusätzliche Klassen zu laden.
Unsere orm.xml
Datei verwendete <entity class="path.to.my.class" metadata-complete="false"/>
, um jede Entity-Klasse aufzurufen, die wir laden mussten. Der metadata-complete
-Teil weist Hibernate an, die in der Klasse gefundenen Annotationen zu verwenden, um die Konfiguration abzuschließen.