2009-08-27 6 views
36

Ich beginne gerade mit der OSGI-Entwicklung und kämpfe darum, zu verstehen, wie man am besten mit abhängigen JARs umgeht.OSGI - Umgang mit JARs von Drittanbietern, die für ein Bundle benötigt werden

Wenn ich ein Bündel erstelle, ist es wahrscheinlich, dass ich ein paar JARs von Drittanbietern verwenden muss. Wenn ich meine Bundle-JAR zur Bereitstellung auf OSGI erstelle, sind diese JARs von Drittanbietern offensichtlich nicht enthalten und das Bundle wird daher nicht ausgeführt.

Ich verstehe, dass eine Option besteht darin, diese JARs in Bündel zu verwandeln und sie auch in den OSGI-Container zu deployen. Wenn sie jedoch nur von dem einen Bündel verwendet werden müssen, scheint dies nicht ideal zu sein.

Was ist die beste Lösung dafür? Können die JARs in das Bündel JAR eingebettet werden, und wenn ja, ist dies ein vernünftiger Ansatz?

Antwort

25

Ich würde fast immer jedes Glas einzeln bündeln. OSGi selbst ist für die Modularisierung gedacht und Sie nehmen das ganze System ad absurdum, indem Sie dies nicht tun.

Wenn Sie JARs in Bundles konvertieren möchten, können Sie die BND Tool written by Peter Kriens verwenden. Aber zuerst würde ich vorschlagen, dass Sie nach dem Bündel in der SpringSource Enterprise Bundle Repository suchen, wenn sie nicht bereits die Arbeit für Sie getan haben.

+0

Wenn Sie nach einer Mainstream-Open-Source-Bibliothek suchen, würde ich gutes Geld auf die Spring-Jungs setzen, die es aus ihrem Repository zur Verfügung stellen. – SteveD

+0

Sie sollten auch die Einbettung vermeiden, da dies manchmal zu merkwürdigem Verhalten führen kann. – Thirlan

+0

Heute sind viele der lbs, die du schon brauchst, Bündel, also ist der erste Ort, an dem du nach mir suchst, der maven central repo. Wenn die Hauptdistribution der lib noch kein Bundle ist, ist es sinnvoll, in den servicemix-Bundles in central nachzusehen. –

9

Es ist möglich, Nicht-OSGi-Abhängigkeiten in das Bundle einzubetten.

Ein einfacher Weg, dies zu tun ist, Maven zu verwenden, um Ihre Abhängigkeiten zu verwalten und Maven Bundle Plugin, um Ihr Bündel zu bauen. Schauen Sie sich die <Embed-Dependency> und <Embed-Transitive> Anweisungen des Maven Bundle Plugins an, die im Abschnitt Embedding dependencies der Plug-in Dokumentationsseite beschrieben sind.

Wie Roland darauf hingewiesen hat, ist dies keine ideale Lösung in Bezug auf die Absichten von OSGi, d. H. Modularisierung und Wiederverwendung einzelner Module. Es kann jedoch eine pragmatische Lösung sein, bis die Abhängigkeiten von Drittanbietern in OSGi-Pakete umgewandelt werden können.

40

Sie können durch Hinzufügen des Dritten jar in das Stammverzeichnis der Bündel JAR-Datei in Ihrem Bündel ein Drittes Glas umfassen und dann ein Bündel Classpath-Header auf das Manifest des Bündels hinzufügen, zB:

Bundle-ClassPath: .,my3rdparty.jar 

wenn Sie dritte jar in das Unterverzeichnis platzieren möchten, geben Sie den Pfad ohne Überschrift mit ./, zB

Bundle-ClassPath: .,lib/my3rdparty.jar # (not ./lib/my3rdparty.jar) 
+0

Ich dachte, ich würde diese Antwort hinzufügen, da es eine Lösung ist, die ich im Internet gefunden habe und schnell arbeiten konnte. Ich schätze jedoch die Meinungen in Bezug auf den Vorteil einer ordnungsgemäßen Bereitstellung der JARs als Bundles. – William

+0

Komma anstelle von Semikolon als Trennzeichen für Klassenpfad – Kojotak

+2

Beachten Sie, dass dies zu CLassCastExceptions führen kann, wenn eines der Objekte im Bundle-Classpath in einem anderen Bundle verwendet wird, das seinen eigenen Bundle-Klassenpfad deklariert, da sein Classloader anders ist – Hilikus

6

Dieser Thread ist ein bisschen alt, aber ich wollte eine der Einschränkungen hinweisen, der Einbettung depen dencies. Sie erinnern sich, dass Abhängigkeiten auf der JAR-Ebene sind, aber wenn Sie Pakete exportieren, müssen einige aus den eingebetteten Abhängigkeiten stammen. Wenn das passiert, werden Sie doppelte Klassen haben, eine inline in der obersten Ebene und eine weitere in der eingebetteten jar. Natürlich können Sie das gesamte eingebettete jar inline einfügen, aber bevor Sie sich dessen bewusst sind, wird es über die gesamte Abhängigkeitskette weitergegeben. Dies ist nur eines der Probleme, auf die Roland und andere verweisen.

4

Hier ist ein Beispiel, wenn Sie die Maven Bundle Plugin verwenden.

Hinweis: Dieses Plugin importiert automatisch Pakete, die Ihre Abhängigkeiten benötigen. Dies kann oder kann kein Problem für Sie sein. Zum Glück können Sie die Pakete unterdrücken, die Sie nicht wirklich importieren müssen (siehe unten).

<Import-Package> 
     <!-- this was imported by one of the dependencies; I don't really need it --> 
     !org.apache.jackrabbit.test, 
     * 
    </Import-Package> 
    <Include-Resource> 
     lib/concurrent-1.3.4.jar, 
     lib/jackrabbit-core-2.6.5.jar, 
     lib/jackrabbit-spi-2.6.5.jar, 
     lib/jackrabbit-spi-commons-2.6.5.jar, 
     lib/lucene-core-3.6.0.jar, 
     lib/tika-core-1.3.jar 
    </Include-Resource> 
    <Bundle-ClassPath> 
     ., 
     concurrent-1.3.4.jar, 
     jackrabbit-core-2.6.5.jar, 
     jackrabbit-spi-2.6.5.jar, 
     jackrabbit-spi-commons-2.6.5.jar, 
     lucene-core-3.6.0.jar, 
     tika-core-1.3.jar 
    </Bundle-ClassPath> 
-4

Können wir OSGI die Bootstrap-Classloader Gläser während der Laufzeit geladen außer Kraft zu setzen, wie wenn wir JAXP1.4.5 verfügbar mit Java7 zu JAXP1.6 außer Kraft setzen wollten, ist es -Dendorese Funktion des Standard-API aktualisiert außer Kraft zu setzen API. Können wir das mit Hilfe von OSGI machen?

+2

Ist das eine Frage oder eine Antwort? Es scheint eine andere Frage zu sein - in diesem Fall sollten Sie es als separate Frage und nicht als Antwort veröffentlichen. –