2011-01-08 20 views
6

Abbiamo un numero di dipendenze di terze parti che non sono ospitate da nessuna parte. Per ognuno di questi abbiamo un file jar che vorremmo poter installare e/o implementare nel nostro repository. Alcuni dei file jar hanno le loro dipendenze e dobbiamo anche dichiararli.maven installa e distribuisci dipendenze di terze parti con una semplice riga di comando

Abbiamo fatto file pom.xml per ogni file jar che dichiarano i GroupID, artifactId, dipendenze, ecc Questi file pom.xml hanno tutti una pom genitore comune che dichiara alcune delle informazioni comuni (ad esempio <repositories> e <distributionManagement>).

Mi piacerebbe essere in grado di installare o implementare queste dipendenze con qualcosa di semplice come mvn install e mvn deploy (o forse mvn install:install-file e mvn deploy:deploy-file) e hanno tutte le proprietà necessarie per questi comandi (artifactId, repositoryId, ecc) essere leggi dai file pom.xml.

Per ottenere questo lavoro, almeno per la distribuzione, ho provato a mettere il seguente nel mio pom genitore:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-deploy-plugin</artifactId> 
     <version>2.4</version> 
     <configuration> 
     <file>${jarfile}</file> 
     <pomFile>pom.xml</pomFile> 
     <repositoryId>our-id</repositoryId> 
     <url>our-url</url> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

e poi avere ciascuno dei pon bambino definire la proprietà jarfile. Ciò mi consente di eseguire mvn deploy:deploy-file per distribuire tutti gli artefatti del figlio secondario. Presumibilmente, potrei fare qualcosa di simile per far funzionare mvn install:install-file.

Ma con questo approccio, io sono in grado di rilasciare il pom genitore (che devo fare dal momento che i poms bambino dipendono da esso), e se provo a mvn release:perform sul POM genitore, ricevo errori come:

Cannot override read-only parameter: pomFile 

Mi sento come se probabilmente stessi andando su questo nel modo sbagliato. Tutto quello che veramente voglio fare è:

  • mettere il codice comune a tutte le terze barattoli parti in uno condiviso POM genitore
  • Scrivi un pom minimo aggiuntivo per ogni barattolo di terze parti
  • in grado di eseguire qualcosa come mvn install o mvn deploy senza dover specificare tutte quelle complicate le proprietà della riga di comando

Come posso meglio realizzare questo?

Edit: Ha reso più chiaro sopra che Idealmente mi piacerebbe essere in grado di eseguire qualcosa di semplice come mvn install o mvn deploy e non è necessario specificare le proprietà nella riga di comando.

risposta

2

Ok, ho trovato una soluzione che mi consente di eseguire solo mvn install o mvn deploy e di avere il file jar installato nel repository locale o remoto. Ispirato da a post to the maven-users list e utilizzando il build-helper plugin, nel pom genitore, ho:

<pluginManagement> 
    <plugins> 
     <!-- Attach the jar file to the artifact --> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>build-helper-maven-plugin</artifactId> 
      <version>1.5</version> 
      <executions> 
       <execution> 
        <id>attach-artifacts</id> 
        <phase>package</phase> 
        <goals> 
         <goal>attach-artifact</goal> 
        </goals> 
        <configuration> 
         <artifacts> 
          <artifact> 
           <file>${artifactId}-${version}.jar</file> 
           <type>jar</type> 
          </artifact> 
         </artifacts> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</pluginManagement> 

E poi nelle pon bambino, ho:

<packaging>pom</packaging> 
<groupId>...</groupId> 
<artifactId>...</artifactId> 
<version>...</version> 
... 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>build-helper-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 

Alcuni dei pezzi di questo che inizialmente mi ha scattato up:

  • L'esecuzione attach-artifact dovrebbe essere sotto <pluginManagement> in modo che non venga eseguito se si mvn install o mvn deploy il genitore
  • I bambini devono specificare lo build-helper-maven-plugin sotto i plugin di compilazione in modo che venga eseguito il codice dal genitore <pluginManagement>.
  • I bambini devono essere dichiarati come <packaging>pom</packaging> perché non è possibile aggiungere un jar a un artefatto se ha lo stesso nome dell'oggetto.

L'unico aspetto negativo che vedo a questo approccio è che il manufatto viene schierato come tipo pom invece di tipo jar. Ma non ho visto alcuna conseguenza reale di ciò.

2

Quando Maven manca una dipendenza, vi darà un errore nel suo output che contiene la riga di comando da emettere per aggiungere il jar a un repository remoto. Quella riga di comando creerà automaticamente un POM per te e caricherà i due insieme. Non è sufficiente per le tue esigenze?

Utilizzando questa funzione, se so che ho una dipendenza senza rappresentazione di repository remota, di solito vado avanti e la definisco nella mia build con il GAV che voglio, esegui il build una volta, poi guarda la build errori. Copiare il comando per la distribuzione, quindi eseguire quel comando. Dovrai assicurarti di avere gli elementi <repository> configurati correttamente nel padre POM plus anche di impostare gli elementi <server> corrispondenti nel tuo settings.xml con la password di caricamento del repository.Oltre a questo, dovresti essere bravo ad andare.

Vorrei aggiungere che dovresti controllare Nexus prima di arrivare a molto lontano. Vale la pena la seccatura di impostare ora! :-)

+0

Mi spiace, cos'è un GAV? E non penso che la linea di comando che Maven fornisce come un errore risolverà il mio problema qui - come può Maven sapere quali dipendenze quel file jar ha senza di me scrivere anche un pom per esso? – Steve

+0

È un'abbreviazione per "Gruppo, Artefatto, Versione". Quando si definisce il GAV per una dipendenza che non è già in un repository remoto (centrale o definito in un '', genera tale riga di comando come parte del rapporto errori. Provalo! –

+0

Sì, vedo che genera una riga di comando come 'mvn deploy: deploy-file -DgroupId = ... -DartifactId = ... -Dversion = ... -Dpackaging = jar -Dfile =/percorso/to/file -Durl = [url] -DrepositoryId = [id] '. Ma non sa quali dipendenze ha questo jar e dato che l'url e repositoryId sono comuni per tutte le dipendenze di terze parti che ho, voglio solo dichiararle una volta in un genitore e non doverli ricordare ogni volta – Steve

0

ho incontrare questo problema nel mio lavoro:

Ora ho un target.jar (che ha una lista delle dipendenze: a.jar, b.jar, c.jar ...), voglio utilizzare mvn install:install-file per metterlo nel mio repo locale, ma quando faccio funzionare l'ordine colpo

mvn install:install-file -Dfile=/Users/username/.../target.jar -DgroupId=com.cnetwork.relevance -DartifactId=target -Dversion=1.0.0 

ma quando lo uso ho trovato ci sono molti errori, il vaso che target.jar uso non può trovare a.jar, b.jar, c.jar, ad esempio:

com.cnetwork.a does not exist 
com.cnetwork.b does not exist 
com.cnetwork.c does not exist 

Poi sono andato a ~/.m2/repository/.../target/1.0.0/target.pom per trovare il file pom del bersaglio, ma niente in esso!

... 
<groupId>com.cnetwork.relevance</groupId> 
<artifactId>target</artifactId> 
<version>1.0.0</version> 
.... 
# no dependencies about a/b/c.jar !!! 

Questo è ciò che va male, il install:file -Dfile -DgroupId -D.. non aggiunge le dipendenze in pom, ho corretto la risposta da questo metodo

  1. se già have this maven project source, basta installarlo nella repo locale

    mvn clean install

  2. se si have the jar and the pom of it, installare jar con pom

    mvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom

  3. se don't have a pom with target jar, scrive uno e utilizza il comando superiore.

  4. se non è possibile recuperare il file pom di esso, potrebbe essere si dovrebbe rinunciare.

Problemi correlati