2009-08-05 13 views
8

Mi sono imbattuto in questa domanda quando trying to share the Struts packages tra più bundle all'interno di un contenitore OSGi. Volevo evitare entrambe le dipendenze di duplicazione all'interno dei bundle e introdurre una nuova dipendenza tra di loro (avendo un pacchetto esportare le sue dipendenze interne per l'altro da condividere).Come posso condividere librerie non OSGi tra bundle in un contenitore OSGi?

Si scopre che la risposta è molto semplice se si utilizza Maven, e se non lo si è, è ancora possibile utilizzare la soluzione Maven per imparare come creare lo stesso risultato con qualche altro meccanismo.

Ho trovato questo approccio utile più volte durante il mio progetto, quindi posterò un esempio qui.

risposta

7

Utilizzando Maven, è molto facile creare un pacchetto OSGi da qualsiasi libreria. Tuttavia, penso che lo stesso risultato possa essere creato anche con altri meccanismi. La soluzione Maven mi ha aiutato a capire come funziona.

Creazione del fascio è fatto con la creazione di un progetto che ha la biblioteca come una dipendenza e poi il confezionamento del progetto utilizzando il maven-bundle-plugin dal Apache Felix project e specificando i pacchetti di libreria con l'istruzione Export-Package. Ho usato questo per condividere Google buffer protocollo tra fasci all'interno di un contenitore OSGi:

<?xml version="1.0" encoding="UTF-8" ?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.example.lib</groupId> 
    <artifactId>protobuf-dist</artifactId> 
    <version>2.1.0</version> 
    <name>Google Protocol Buffers OSGi Distribution</name> 
    <packaging>bundle</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.google.protobuf</groupId> 
     <artifactId>protobuf-java</artifactId> 
     <version>2.1.0</version> 
     <scope>compile</scope> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>maven-bundle-plugin</artifactId> 
     <extensions>true</extensions> 
     <configuration> 
      <instructions> 
      <Export-Package>com.google.protobuf</Export-Package> 
      </instructions> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Se si desidera che tutte le dipendenze transitive rotolato in bundle, anche, utilizzare il bundleall obiettivo del plugin.

Il plug-in riconosce e onora i manifesti OSGi esistenti nella dipendenza.

È anche possibile utilizzare il plug-in di bundle per creare semplicemente manifest e indicare al plugin di imballaggio jar (o assembly incorporato jar-with-dependencies) per utilizzare tale manifest tramite la sezione archive. La pagina del plugin collegata sopra mostra come farlo.

9

un percorso aggiuntivo per chi non è così appassionato di Maven, incapace di porto, o perfettamente felice con ant/edera

ho trovato il modo più semplice che per realizzare il compito dichiarato è quello di trasformare il non-OSGi libreria in una libreria OSGi lasciando che manifest pubblicizzi ogni pacchetto e aggiunga alcuni nomi/versioni simbolici approriati. Sono stato in grado di farlo MOLTO facilmente con bnd tramite attività ant (o anche invocazione diretta della riga di comando). Ci sono anche repositories che contengono la versione "osgi-ified" di molte librerie popolari. Alcune librerie (joda-time) sono già in vendita con manifesti OSGi corretti.

+1

Ci sono anche repository che contengono la versione "osgi-ified" di molte librerie popolari: SpringSource è una grande: http://www.springsource.com/repository/app/ – Thilo

+0

grazie per il link! – basszero

Problemi correlati