2013-02-16 6 views
8

Próbuję zrozumieć różnicę pomiędzy następującymiOSGI Bundle vs zależność słoik

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

I

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

The samego artefaktu dal został określony jako opakowanie wiązki jak:

<packaging>bundle</packaging> 

Teraz, gdy rozmieszczam dal artefakt, widzę go opublikowany w repozytorium jako słoik (z manifestem w nim). W tym przypadku, jaka powinna być moja zależność od dal. Czy powinien to być pakiet typu lub słoik? Jeśli robię OSGI, zakładam, że będzie to typ określony jako pakunek. Czy to jest poprawne? Czy mogę po prostu mieć zależność słoik tutaj?

Odpowiedz

11

Kiedy deklarujesz zależność w Maven, możesz polegać tylko na normalnym Słoiku, a nie na pakiecie, ponieważ Maven nie rozpoznaje ograniczeń środowiska OSGi.

Zobacz na to pytanie: (! Ale powinien)

Why can't maven find an osgi bundle dependency?

W czasie kompilacji projektu, nie trzeba się martwić o środowisku OSGi jeszcze ... na przykład, że będzie nie narzekaj, jeśli spróbujesz użyć pakietów, które nie są eksportowane przez pakiet, którego używasz ...

Podczas próby rozmieszczenia pakietu w kontenerze OSGi, jeśli poprawnie zadeklarowałeś swoje zależności w pakietach "dal" którego używasz, włączając w to oczywiście wersję (którą zazwyczaj powinieneś zostawić dla dodatku do maven-bundle) bazując na twoim POM), zostanie rozwiązany tylko wtedy, gdy w kontenerze znajduje się pakunek, który eksportuje wymagane pakiety w odpowiedniej wersji (lub zakresie wersji).

Biorąc pod uwagę, że "dal" wydaje się być już pakietem, wystarczy, że wdrożysz swój pakiet i "dal" razem i wszystko będzie działać poprawnie.

Jednakże, jeśli przez pomyłkę dodał zależność od prywatnej pakietu „Dal”, chociaż chętnie Maven skompilować to dla ciebie, gdy wrzucono go w OSGi będziesz witany przez szkodliwe wyjątkiem okablowania :)

Należy zauważyć, że pakunek jest zwykłym słoiczkiem zawierającym metadane OSGi w manifeście (Bundle-SymbolicName, Bundle-Version itp.). Więc jeśli nie używasz OSGi, pakiet będzie działał jak każdy inny słoik.

Ale w każdym razie, jeśli chcesz trochę więcej informacji, sprawdź to pytanie:

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

+0

„, na przykład, nie będzie narzekać, jeśli starają się używać pakietów nie wywożone przez wiązki jesteś w zależności od .... " Czy to oznacza, że ​​zależności OSGI są wymuszane (i wykrywane) w środowisku wykonawczym? Myślałem, że pakiet eksportowy został zweryfikowany podczas kompilacji. – Sudoer

+1

Zależności zostaną ROZWIĄZANE po zainstalowaniu pakietu w kontenerze OSGi. Ponieważ OSGi jest środowiskiem dynamicznym, możesz zainstalować pakiet w dowolnym momencie ... Jeśli pakiet przejdzie w stan RESOLVED, może on zostać ZAKOŃCZONY. Innymi słowy, instalacja jest rodzajem dynamicznej kompilacji ... jeśli pakiet ją przekaże, jest zagwarantowane, że w momencie instalacji wszystkie importowane towary były spełnione, więc pakiet może zostać uruchomiony. – Renato

+1

Nie ma mowy, że OSGi może rozwiązać zależności między pakietami zanim spróbujesz je zainstalować, ponieważ będzie to zależało od zestawu pakietów dostępnych podczas instalacji.Z kolei Maven używa normalnej procedury kompilacji Java, ignorując reguły widoczności OSGi ... to główna różnica. – Renato