Als erstes benötigt man natürlich die aktuelle Hibernate Version, genutzt würde hier die Version 3.6.1 die mit knapp 50 MiB zu buche schlägt.
Nun legt man sich ein neues Bundle an mit dem Namen
org.hibernate an.
Als nächstes die hibernate3.jar übernehmen und in den Bundle-Classpath übernehmen (in Eclipse über den Manifest-Editor unter dem Reiter 'Runtime'), und folgende Packages exportieren:
- org.hibernate
- org.hibernate.cfg
- org.hibernate.classic
Das war der einfache Teil. Nun geht es daran die im 'lib' Ordner liegenden externen Bibliotheken einzubinden. Hierbei ist sind prinzipiell folgende drei Verfahren denkbar:
- Die Abhängigkeit wird in das Hibernatebundle übernommen, die Packages der entsprechenden Abhängigkeit werden weder importiert noch exportiert.
- Die Abhängikeit wird durch ein separates Bundle bereitgestellt, dieses exportiert die nötigen Packages, das Hibernatebundle importiert diese.
- Eine Kombination aus beidem: Die Abhängigkeit wird in das Hibernatebundle integriert, gleichzeitig werden die betreffenden Packages als optionaler import hinzugefügt.
Die dritte Methode funktioniert folgendermaßen: Wenn das Package von einem anderem Bundle im OSGi System bereitgestellt wird, so wird diese importiert. Ansonsten kommt der Bundle-Classloader zum Einsatz und die intern vorhandenen Klassen werden geladen (siehe OSGi Core Specification Version 4.2, Abschnitt 3,6.3). Diese hat jedoch den Nachteil, dass einerseits das Bundle unnötig groß wird, das Bundlemanifest extrem unübersichtlich und zumindest mit Equinox unter Eclipse scheint es in bestimmten Konfigurationen Probleme mit optionalen imports zu geben. Wir werden daher im weiterem Verlauf entweder Methode 1 oder Methode 2 anwenden, auch wenn später Methode 3 für einen speziellen Fall von Bedeutung sein wird wenn es um die Integration der JDBC Treiber geht.
Required Libarys
Wir beginnen zunächst uns dem laut Hibernate nötigstem zuzuwenden. Unter required finden wir:
antlr-2.7.6.jar, commons-collections-3.1.jar, dom4j-1.6.1.jar, javassist-3.12.0.GA.jar, jta-1.1.jar, slf4j-api-1.6.1.jar. Die ersten vier (
ANTLR,
Commons Collections,
dom4j und
Javassist) werden auf dem erstem Wege genauso wie das
hibernate3.jar direkt in das Hibernatebundle integriert, da ich diese Library bisher nicht einsetze. Wer dies jedoch tut sollte für diese ein separates Bundle anlegen oder z.B. bei
Orbit runterladen.
Die
jta-1.1.jar enthält die "JBoss Transaction 1.0.1 API", eine alternative Version gibt es bei Orbit als Bundle
javax.transaction. Ob man dies also extern einbindet oder direkt bleibt jedem selbst überlassen, ich habe dies vorerst ebenfalls integriert.
Als letztes bleibt noch die
SLF4J API. Da ich selbst SLF4J verwende habe ich dieses entfernt und stattdessen einen import für das Package
org.slf4j hinzugefügt. Falls man SLF4J nicht einsetzt, so empfiehlt es sich trotzdem dieses auszulagern, da möglicherweise andere Bundles ebenfalls davon abhängen könnten und somit unnötige Doppelung und mögliche Classloadingprobleme vermieden werden.
Optional Libarys
Dieser Ordner enthält vor allem verschiedene Cache Implementierungen und optionale Erweiterungen. Hier muss jeder für sich entscheiden welche Erweiterungen er nutzen möchte. Ich habe zunächst keine dieser Erweiterungen genutzt.
Sonstige Libarys
Was bleibt ist
jpa und
bytecode. Das erste beinhaltet die
Java Persistence API, und stellt hauptsächlich die Annotationen für die Persistenzklassen bereit. Um eine direkte Abhängigkeit der späteren Datenklassen vom Hibernatebundle zu verhindern sollte dieses ausgelagert werden. Orbit bietet hier schon ein fertiges Bundle
javax.persistence an, leider nur in der 1.0 Version, Hibernate scheint aber zwingend 2.0 zu benötigen. Also muss man sich dieses selbst bauen, oder ebenfalls in das Hibernatebundle integrieren (und dann die packages
- javax.persistence
- javax.persistence.criteria
- javax.persistence.metamodel
exportieren.
Achtung: Beim export darauf achten als Version 2.0.0 exportieren, damit dies nicht mit einer möglicherweise im Target vorkommenden Version 1.0 interferriert, auch beim Import sollte eine minimum Version von 2.0 gefordert werden, ansonsten kann es vorkommen, dass Hibernate die Klasse nicht korrekt mapped und stattdessen eine
EntityNotFoundException bescheren.
Die
bytecode Anteile bieten noch Alternativen zum in unserem Fall standardmäßig verwendetem Javassist, kann also getrost weggelassen werden.
Der erste Schritt ist damit getan, wir haben ein Hibernate-Basisbundle auf dem unsere weitere OSGi-Integration aufbauen kann.