2013-02-16 17 views
8

Ich versuche, den Unterschied zwischen dem folgendenOSGi-Bundle vs jar Abhängigkeit

<dependency> 
     <groupId>com.myspace.order</groupId> 
     <artifactId>dal</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
    </dependency> 

UND

<dependency> 
     <groupId>com.myspace.order</groupId> 
     <artifactId>dal</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
     <type>bundle</type> 
    </dependency> 

The dal Artefakt selbst hat Verpackung angegeben als Bündel zu verstehen:

<packaging>bundle</packaging> 

Jetzt, wenn ich das Dal Artefakt bereitstellen, sehe ich es im Repo als ein Glas (mit einem Manifest darin) veröffentlicht. In diesem Fall sollte meine Abhängigkeit von dal sein. Sollte es vom Typ Bündel oder Glas sein? Wenn ich OSGI mache, gehe ich davon aus, den Typ als Bundle anzugeben. Ist das richtig? Oder kann ich hier nur eine Jar-Abhängigkeit haben?

Antwort

11

Wenn Sie eine Abhängigkeit in Maven deklarieren, können Sie nur von einem normalen Jar und nicht von einem Bundle abhängig sein, da Maven die OSGi-Umgebungseinschränkungen nicht erkennt.

diese Frage finden: (! Aber sollte)

Why can't maven find an osgi bundle dependency?

Zu der Zeit Sie Ihr Projekt kompilieren, Sie brauchen keine Sorgen zu über die Umwelt OSGi noch ... zum Beispiel, wird es nicht beschweren, wenn Sie versuchen, Pakete zu verwenden, die nicht von dem Paket exportiert werden, auf das Sie angewiesen sind.

Wenn Sie versuchen, Ihr Bundle in einem OSGi-Container bereitzustellen, wenn Sie Ihre Abhängigkeiten zu den 'dal' -Paketen korrekt deklariert haben Du verwendest natürlich auch die Version (die du normalerweise für das maven-bundle-plugin verwenden solltest) Sie basiert auf Ihrem POM), wird es nur gelöst, wenn es ein Bündel innerhalb des Containers gibt, der die erforderlichen Pakete in der richtigen Version (oder im Versionsbereich) exportiert.

Wenn man bedenkt, dass 'dal' bereits ein Bündel zu sein scheint, müssen Sie nur sicherstellen, dass Sie Ihr Bundle und 'dal' zusammen bereitstellen und alles wird gut funktionieren.

jedoch hinzugefügt, wenn Sie versehentlich eine Abhängigkeit von einem privaten Paket von ‚dal‘, obwohl Maven kompiliert es glücklich für Sie, wenn Sie es in OSGi geworfen Sie von einer bösen Verdrahtung Ausnahme begrüßt werden :)

Beachten Sie, dass ein Bündel nur ein normales Jar ist, das OSGi-Metadaten im Manifest enthält (Bundle-SymbolicName, Bundle-Version usw.). Wenn Sie also OSGi nicht verwenden, funktioniert ein Paket wie jedes andere jar.

Aber wie auch immer, wenn Sie einige weitere Informationen wünschen, überprüfen Sie diese Frage:

What is the meaning of type "bundle" in a maven dependency?

+0

„zum Beispiel, wird es nicht beschweren, wenn Sie versuchen, Pakete zu verwenden, nicht durch das Bündel exportiert Sie je nach .... " Bedeutet dies, dass OSGI-Abhängigkeiten zur Laufzeit erzwungen (und erkannt) werden? Ich dachte, das Exportpaket wurde zur Kompilierzeit verifiziert. – Sudoer

+1

Die Abhängigkeiten werden BEHOBEN, wenn Sie das Bundle im OSGi-Container INSTALLIEREN. Da OSGi eine dynamische Umgebung ist, können Sie jederzeit ein Paket installieren ... Wenn das Paket den Status BEHOBEN erreicht, wird es möglicherweise STARTED. Mit anderen Worten, die Installation ist eine Art dynamisches Kompilieren ... wenn das Bundle das übergibt, ist garantiert, dass zum Zeitpunkt der Installation alle Importe erfüllt waren, so dass das Bundle gestartet werden kann. – Renato

+1

Es gibt keine Möglichkeit, dass OSGi die Bundle-Abhängigkeiten auflösen kann, bevor Sie es tatsächlich installieren, da dies von den Bundles abhängt, die zum Zeitpunkt der Installation verfügbar sind.Maven hingegen verwendet das normale Java-Kompilierungsverfahren und ignoriert OSGi-Sichtbarkeitsregeln ... das ist der Hauptunterschied. – Renato

Verwandte Themen