2011-09-13 10 views
5

Ho un bundle OSGi che è stato creato usando Maven da un'altra squadra. Il file POM dichiara la sua confezione come "pacchetto" e utilizza il plugin Apache Felix.Come distribuire il bundle OSGi su repository Maven con deploy: deploy-file?

Ho bisogno di distribuire questo artefatto in un repository Maven locale (Nexus) in modo che possa essere utilizzato dai nostri progetti interni.

Ho utilizzato la destinazione deploy:deploy-file per distribuire il pacchetto nel repository, proprio come si farebbe con un file JAR standard e questo funziona senza errori. Ho estratto il POM incorporato dal fascio e passai che sulla linea di comando, in modo che la linea di comando era:

mvn deploy:deploy-file -Dfile=3rdpartybundle.jar -DpomFile=pom.xml -DrepositoryId=internal -Durl=http://internalserver/nexus 

Il problema è che dopo aver distribuito in questo modo, la confezione è impostato per raggruppare e come risultato il nome del manufatto nel repository finisce con un'estensione .bundle, invece che con un'estensione .jar.

Ora, non riusciamo a capire come dichiararlo come una dipendenza. Se lo dichiariamo in questo modo:

 <dependency> 
      <groupId>...</groupId> 
      <artifactId>...</artifactId> 
      <version>...</version> 
      <type>bundle</type> 
     </dependency> 

Viene visualizzato un errore che indica che la dipendenza non può essere risolta. La cosa interessante è che le coordinate GAV nel messaggio di errore hanno effettivamente "jar" come valore per il tipo di dipendenza anche se lo impostiamo come "bundle".

Se cambiamo la dipendenza a:

 <dependency> 
      <groupId>...</groupId> 
      <artifactId>...</artifactId> 
      <version>...</version> 
      <type>jar</type> 
     </dependency> 

Otteniamo lo stesso errore di dipendenza irrisolta esatto.

Quindi, come si suppone di distribuire un artefatto confezionato come pacchetto in un repository Maven, in modo che possa essere utilizzato come dipendenza dal tempo di compilazione per un altro progetto?

Grazie

+0

Mi rendo conto che il mio uso del termine "repository locale" potrebbe essere stato confuso. Sto provando a distribuire su un repository Nexus su un server remoto. Il server è condiviso da tutti i membri del nostro team. Quando ho detto "locale", immagino che cosa intendevo dire "all'interno del nostro firewall sulla nostra LAN". –

risposta

0

Grazie per le risposte, penso di avere una soluzione (non la chiamerei una soluzione anche se).

@earcar è sulla strada giusta, sebbene tale soluzione non sfrutti tutte le informazioni disponibili nel pom.xml già disponibile nel pacchetto di terze parti (in particolare le dipendenze).

Quindi cosa sembra funzionare, anche se la documentazione per il deploy: distribuire-file è un po 'vago, è che si può passare un file pom.xml E impostare anche il parametro di confezionamento, allo stesso tempo. Così la mia linea di comando ora si presenta così:

mvn deploy:deploy-file -Dfile=3rdpartybundle.jar -DpomFile=pom.xml -DrepositoryId=internal -Durl=http://internalserver/nexus -Dpackaging=jar 

Facendo in questo modo, il pom.xml nel repository dice ancora che l'imballaggio è di tipo "fascio", e comprende tutte le dipendenze, ecc, ma lo stesso artefatto ha un'estensione di file .jar.

Poi quando dichiariamo la nostra dipendenza come tipo JAR, Maven è in grado di risolvere con successo:

<dependency> 
     <groupId>...</groupId> 
     <artifactId>...</artifactId> 
     <version>...</version> 
     <type>jar</type> 
    </dependency> 

questo risolve fondamentalmente il nostro problema. Non sono sicuro di quanto sia portatile o affidabile. FWIW, stiamo eseguendo Maven 3.0.3

Grazie per l'aiuto.

0

Si consiglia di provare la rimozione del tipo completamente, e poi fare un semplice

mvn install 

Nella directory che contiene il file pom.xml.

+0

Ma questo installerebbe l'artefatto solo nel repository locale ... –

+0

Ahh sì, capisco. Pensavo che ti stavi riferendo al repository locale, ma a un secondo leggi chiaramente che intendevi il nexus. Nel mio ambiente nexus usiamo script di shell bash per distribuirli. quindi, sono interessato quanto te a vedere qual è la soluzione! –

+0

Corretto, dobbiamo sicuramente distribuire su un repository remoto che esegue Nexus condiviso da tutto il team. –

0

Inizialmente, si è tentato di richiamare semplicemente mvn deploy nella cartella del pacchetto. Mi aspetto che il bundle diventi, generato, testato e distribuito se distributionManagement è configurato per la distribuzione sul tuo nesso.
Se ciò non riesce, è possibile importare manualmente il pacchetto utilizzando l'interfaccia Web nexus in un repository ospitato.

+0

Penso che ti sia mancato il punto. Il problema non è quello di installarlo, è il tipo "bundle" usato dal plugin bundle. – Robin

+0

Ma nella sua domanda ha detto "3rdpartybundle.jar" che mi sembra che l'artefatto del progetto, confezionato come "pacchetto", sia un file jar. E per quanto posso vedere sul sito Web del plugin Apache Felix Bundle, crea un file jar come artefatto. Quindi se l'artefatto viene implementato come ".bundle", vorrei verificare se c'è un altro plugin configurato che potrebbe rinominare l'artefatto, prima della distribuzione. –

+0

Il pacchetto proviene da un team di un'altra società. Non abbiamo la fonte ecc. Stiamo provando a distribuire un pacchetto già costruito. –

3

Il problema è che "3rdpartybundle.jar" si sta costruendo senza impostare estensioni = true e/o supportati tipi:

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
... 
    <extensions>true</extensions> 
... 
    <configuration> 
     <supportedProjectTypes> 
      <supportedProjectType>jar</supportedProjectType> 
      <supportedProjectType>war</supportedProjectType> 
     </supportedProjectTypes> 

Se non è possibile risolvere il problema che a monte, poi ci sono un paio di opzioni;

1) Reimballare come un vaso con un nuovo progetto di pom:

    <plugin> 
          <groupId>org.apache.maven.plugins</groupId> 
          <artifactId>maven-dependency-plugin</artifactId> 
          <version>2.3</version> 
          <configuration> 
            <actTransitively>false</actTransitively> 
            <outputDirectory>target/classes</outputDirectory> 
            <artifactItems> 
              <artifactItem> 
                <groupId>3rd</groupId> 
                <artifactId>party</artifactId> 
                <version>X.Y.Z</version> 
              </artifactItem> 
            </artifactItems> 
          </configuration> 
          <executions> 
            <execution> 
              <goals> 
                <goal>unpack</goal> 
              </goals> 
              <phase>compile</phase> 
            </execution> 
          </executions> 
        </plugin> 

2) Provare a utilizzare mvn deploy:deploy-file con -DgeneratePom=false -Dpackaging=jar -Dfile=/path/to/3rdpartybundle.jar ma senza specificare -DpomFile= - spero non c'è META-INF/Maven/pom.xml all'interno del 3rdpartybundle.jar - dovrebbe funzionare usando questo, ma dovrai specificare i parametri groupId/artifactId/version in quanto questi non saranno derivati ​​dal pom del progetto.

So che ho creato artefatti di bundle in passato e li ho implementati nel nostro nesso (v1.9.0.1) e quelli nel repository Spring sono stati inseriti anche in bundle, ma non ricordo alcun problema. (Per inciso non è necessario specificare il bundle nelle dichiarazioni di dipendenza, AFAIK se è l'unico artefatto che dovrebbe essere dedotto)

+0

Mi sono imbattuto in un problema simile nel tentativo di distribuire file impacchettati con il pacchetto "bundle". "-DgeneratePom = false -Dpackaging = jar" era la magia di cui avevo bisogno. Grazie. – Jared

Problemi correlati