2012-05-03 8 views
9

Abbiamo molti componenti dai quali vogliamo modularizzare solo alcuni per iniziare. Ti chiedi quale sia il modo migliore (nel contesto del mio ambiente di sviluppo) per creare pacchetti in tutti questi componenti?Il modo migliore per convertire i progetti java esistenti in bundle di osgi

Il mio ambiente: Java 6, Maven 2.2.1, Hudson

Technologies: Primavera 3.0.5, WebSphere 7, Hibernate 3.2.x e la maggior parte dei beni comuni apache.

Requisiti

  1. rendere modulare solo pochi componenti. Il resto dei componenti può esportare tutti i pacchetti.
  2. Quando importate in eclissi, dovrei essere in grado di vedere i fasci di importazione-pacchetti come dipendenze di percorso di generazione (eclissi mvn: Eclipse non sembra farlo)

risposta

9

Inizia cambiando solo le voci MANIFEST.MF in modo tale che tutti i tuoi artefatti diventino pacchetti - ovviamente non funzioneranno magicamente ma è un buon primo passo non distruttivo.

Quando si utilizza il Maven-fascio-plugin assicurarsi di impostare extensions e supportedProjectTypes come si possono avere problemi con CI costruisce, pronti contro termine e Maven M2E mancanza se il tipo di confezione è bundle (vedi fine).

Verificare le dipendenze esterne riskiest/core in anticipo, ad esempio se si utilizza JPA per la persistenza, quindi assicurarsi che il provider funzioni in un ambiente OSGi con il pacchetto di domini e il driver JDBC.

Se si sta migrando da Java EE/primavera guardate Karaf o Virgo. Ma se i tuoi componenti sono per sistemi embedded o non hanno dipendenze esterne, Felix o Equinox potrebbero essere sufficienti (anche se controlla il progetto pax-url se è così).

Potrebbe valere la pena di modificare la tua domanda per essere un po 'più specifico sul dominio/tecnologie?


eclissi: eclissi genera solo che quando il progetto è configurato prima, i problemi del ciclo di vita del M2E potrebbe essere un po 'di dolore, ma è molto meglio che utilizzare il vecchio tappo di eclissi.


Quanto segue aggiungerà voci manifest ai tuoi artefatti esistenti senza modificarli in altro modo. Indica al plugin standard maven jar e war di usare MANIFEST.MF generato da maven-bundle-plugin.

mettere questo nel POM genitore:

<pluginManagement> 
<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <version>2.3.7</version> 
    <extensions>true</extensions> 
    <configuration> 
     <archive> 
      <addMavenDescriptor>true</addMavenDescriptor> 
     </archive> 
     <supportedProjectTypes> 
      <supportedProjectType>jar</supportedProjectType> 
      <supportedProjectType>war</supportedProjectType> 
     </supportedProjectTypes> 
     <instructions> 
      <Built-By>${project.organization.name}</Built-By> 
      <Bundle-Vendor>${project.organization.name}</Bundle-Vendor> 
      <Bundle-ContactAddress>${project.organization.url}</Bundle-ContactAddress> 
      <Bundle-Description>${project.description}</Bundle-Description> 
      <Bundle-DocURL>${bundle.doc.url}</Bundle-DocURL> 
      <Bundle-Category>${bundle.category}</Bundle-Category> 
      <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
      <Bundle-Version>${project.version}</Bundle-Version> 

      <Import-Package>*</Import-Package> 
      <Export-Package>*</Export-Package> 
     </instructions> 
    </configuration> 
    <executions> 
     <execution> 
      <id>bundle</id> 
      <goals> 
       <goal>manifest</goal> 
      </goals> 
      <phase>prepare-package</phase> 
      <inherited>true</inherited> 
     </execution> 
    </executions> 
</plugin> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.1</version> 
    <configuration> 
     <archive> 
      <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile> 
     </archive> 
    </configuration> 
</plugin> 

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <executions> 
     <execution> 
      <id>create-war</id> 
      <phase>package</phase> 
      <goals> 
       <goal>war</goal> 
      </goals> 
      <inherited>true</inherited> 
     </execution> 
    </executions> 
    <configuration> 
     <archive> 
      <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile> 
     </archive> 
    </configuration> 
</plugin> 
</pluginManagement> 

Poi, nel POMs bambino, si può semplicemente fare:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-bundle-plugin</artifactId> 
     </plugin> 
     <!-- Below is mutually exclusive: Either jar or war plugin --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 
+0

Ho due opzioni per eseguire questi pochi pacchetti 1) in Embedded Felix witin WAR 2) Witin WAB –

+0

Ho aggiornato il mio post con le tecnologie. Hai provato Tycho? –

+0

Post molto informativo: il contenuto POM è particolarmente utile, grazie al nostro auricolare. Nota per gli utenti: è necessario commentare la sezione del plugin maven-war se è in esecuzione su un JAR, altrimenti l'obiettivo del pacchetto fallirà. – KomodoDave

3

Utilizzare il maven bundle plugin. Aggiungerà le istruzioni di importazione ed esportazione richieste a manifest in base alla scansione del codice e alle dipendenze definite nel pom. Ciò richiederà il minimo sforzo per la conversione.

Si consiglia inoltre di utilizzare M2Eclipse invece di eclissi mvn: eclissi. Mantiene sincronizzati la tua Maven Config e lo spazio di lavoro.

+0

Ma m2eclipse viene fornito con Maven 3 a destra. –

+1

È configurabile, è possibile impostarlo su un'installazione esterna - potrebbe funzionare con Maven2. Ma avrai un chilometraggio considerevolmente migliore con m2e e maven-bundle-plugin – earcam

4

Date un'occhiata a bndtools, ha un eccellente supporto per la creazione di progetti che avvolgono gruppi. Fornisce molte informazioni su come sono strutturati i JAR e come dipendono da altre cose.

+0

Bndtools sposta automaticamente i jar generati sul repository maven? o in che modo i vasi possono essere spostati in mvn repo? –

+0

Piuttosto vecchio ora, ma probabilmente vale la pena di rivelare la tua affiliazione con bndtools – Flexo

+0

Perché sarebbe necessario? Bndtools non è un prodotto? –