OSGi Bundles richtig exportieren?

Soahc

Aktives Mitglied
Hallo Zusammen,

ich habe eine Frage zum Exportieren von Bundles (als Deployable plug-ins and fragments) aus Eclipse heraus. Möchte ich später ein als JAR-Archiv exportiertes Bundle in Equinox nutzen, so müssen alle Abhängligkeiten richtig im "Import-Package"-Manifest-Header, der Manifest-Datei angegeben werden. Nutze ich z.B. Swing-Klassen in meiner Bundle so muss ich dort auch javax.swing mit angeben. Tue ich das nicht gibt es eine entsprechende classnotfound-Exception beim installieren oder starten des Bundles im OSGi-Framework. Soweit so gut.
Nun habe ich jetzt aber schon öfter Situationen gehabt in denen ich die Abhängigkeiten vorher gar nicht so einfach herausbekomme. z.B. habe ich mir einen OSGi-Service geschrieben, der mir einen JPA-Zugriff per Eclipse-Link auf eine Derby-Datenbank realisiert. Hier sehen meine Abhängikeiten nachher so aus:

Java:
Import-Package: javax.management,
 javax.naming,
 javax.naming.spi,
 javax.sql,
 javax.swing,
 javax.xml.datatype,
 javax.xml.namespace,
 javax.xml.parsers,
 org.osgi.framework;version="1.3.0",
 org.w3c.dom,
 org.xml.sax

und um die herauszubekommen habe ich 10 minuten lang per try and error versucht das bundle im framework zu installieren. So und jetzt meine Frage. :) Gibt es nicht irgendwie die Möglichkeit, diese Abhängigkeiten automatisch in die Manifestdatei schreiben zu lassen? Ich habe bei den Export-Einstellungen leider nichts gefunden. Und was mich auch wundert. Wenn ich das Bundle aus Eclipse heraus starte, brauche ich diese Abhängigkeiten nicht mit anzugeben.

liebe Grüße, Soahc
 
T

Tomate_Salat

Gast
Ich weis nicht wie das bei Equinox ist (ich nehme mal an ähnlich), aber bei Felix kann man in der Configuration angeben, welche packages standardmäßig geladen werden sollen (so z.B. javax.swing, was dort standardmäßig nicht vorhanden ist). Bei Equinox habe ich soetwas aber bisher noch nicht benötigt.

Ein automatisches erkennen gibt es so glaube ich nicht, weil (bei eclipse) diese Packages in der IDE zur verfügung stehen. Vllt bekommt man Meldungen, wenn man dort ein wenig mit den Einstellungen spielt. Wenn ich was gefunden habe, melde ich mich.

Edit finde nichts, wo man etwas umstellen könnte. Aber wenn du Equinox nutzt, könntest du auch eine Application daraus machen (so mache ich das zumindest). Oder du schaust mal nach, welche packages Eclipse standardmäßig importiert und übernimmst diese. Wie und Wo müsste ich jz auch erst nachschauen (heist: googlen :))
 
Zuletzt bearbeitet von einem Moderator:
G

Gelöschtes Mitglied 5909

Gast
So wie es aussieht baut er keine RCP Anwendung Tomate_Salat.

Schau mal nach bootdelegation und system packages. Es geht im Grunde um all die packages, die nicht im java.* package liegen (auch javax liegt dort nicht).

Ich hatte vor ca 1 Jahr mal eine minimale OSGi Umgebung zusammengebastelt, mit hot deployment.

Im java.profile kann man einstellen, welche sachen in der boot delegation und welche in den system packages sind.

Kurze erklärung:

boot delegation sind die packages die implizit vom Framework an das JDK/JRE weitergeleitet werden. Dabei muss kein import package verwendet werden. Das hat u.a. den vorteil, dass bestehende libs einfacher OSGiified werden können. Aber der große nachteil daran ist, dass die bootdelegation immer gewinnt.

Beispiel: du möchtest jaxb in version 2.x verwenden. Jetzt kannst du das bundle im framework installieren,
es wird aber immer (!) das vom JDK verwendet, wenn es in der bootdelegation vorhanden ist.
Um Version 2.x verwenden zu können, darf es nicht in der bootdelegation sein. Default mäßig ist z.b. com.sun.* in der bootdelegation und diverse andere.

Was default mäßig in der bootdelegation ist, kannst du erfahren indem du die Framework jar öffnest und nach der entsprechenden .profile suchst.

System packages:

System packages kann man sich so vorstellen, dass das Framework ein export package macht. Dadurch hat man im Grunde alle Vorteile und den nachteil der bootdelegation nicht. Nachteil: Import Package notwendig.

Ein paar goldene regeln:

1. verwende kein require bundle
2. verwende import package mit versionsangabe (am besten lower und upper bound) und export package auch mit versionsangabe
3. Halte die bootdelegation möglichst klein / schalte sie ab (wird in der praxis meist nicht gehn, wegen com.sun.*)
4. verwende tools wie bndtools, spring bundlor, etc.
5. achte darauf dass es im OSGi container läuft und wundere dich nicht wenn es in eclipse geht aber im container nicht.
6. bootdelegation und system packages sind ein komplexes Thema, mach dich schlau!

Hier ist der Link zu meiner damaligen minimalen OSGi Runtime:
http://ethone.de/java-forum/equinox 3.6.zip

Da geht auch hot deployment, deine bundles schmeißt du einfach in den bundles ordner.

Was ich dir aber empfehlen würde ist

Karaf 2.2.2
 

Soahc

Aktives Mitglied
wow vielen Dank für die ausgiebige Erklärung. :) Derzeit verwende ich equinox-SDK-3.6.2 als Runtime... werd mir aber mal die anderen beiden ansehen!
 

Ähnliche Java Themen


Oben