Maven installare e distribuire 3rd dipendenze del partito con una semplice linea di comando

StackOverflow https://stackoverflow.com/questions/4632648

  •  08-10-2019
  •  | 
  •  

Domanda

Abbiamo un numero di dipendenze di terze parti che non sono ospitati da nessuna parte. Per ciascuno di questi abbiamo un file jar che vorremmo essere in grado di installare e / o implementare al nostro repository. Alcuni dei file jar hanno le loro dipendenze e abbiamo anche bisogno di dichiarare questi.

Abbiamo fatto file pom.xml per ogni file jar che dichiarano i GroupID, artifactId, dipendenze, ecc file Questi pom.xml tutti hanno un 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 letto 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. Che mi permette di correre mvn deploy:deploy-file di distribuire tutti i manufatti bambino pom. Presumibilmente avrei potuto fare qualcosa di simile per ottenere mvn install:install-file al lavoro.

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 sto probabilmente andando su questo nel modo sbagliato. Tutto quello che veramente voglio fare è:

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

Come posso meglio realizzare questo?

Modifica:. 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 devono specificare le proprietà nella riga di comando

È stato utile?

Soluzione 2

Ok, ho trovato una soluzione che mi permette di correre solo mvn install o mvn deploy ed avere il file jar installati al repository locale o remoto. Ispirato da un post al Maven list degli utenti e utilizzando il accumulo helper plug , 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:

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

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 alcun reali conseguenze di questo.

Altri suggerimenti

Quando Maven manca una dipendenza, che vi darà un errore in esso di uscita che contiene la riga di comando per numero per aggiungere il vaso per un repository remoto. Quella linea di comando creerà automaticamente un POM per voi e per caricare i due insieme. È che non è sufficiente per le vostre esigenze?

Utilizzando questo strumento, se io so che ho una dipendenza con alcuna dichiarazione a distanza repository, di solito basta andare avanti e definire nel mio compilazione con l'GAV che voglio, eseguire la build una volta, poi guardare gli errori di generazione . Copiare il comando per la distribuzione, quindi eseguire quel comando. Ti consigliamo di fare in modo di avere gli elementi <repository> impostate correttamente nel POM genitore più anche istituito corrispondenti elementi <server> nel vostro settings.xml con la password di upload repository. Oltre a questo, si dovrebbe essere pronti per partire.

Vorrei aggiungere che si dovrebbe verificare Nexus prima di arrivare a lontano. Vale la pena la seccatura di istituire ora! : -)

mi capita di incontrare questo problema nel mio lavoro:

  

Ora ho un target.jar (che ha una lista delle dipendenze: a.jar, b.jar, c.jar ...), voglio usare mvn install:install-file per metterlo nel mio repo locale, ma quando corro il comando 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 utilizzano target.jar non riesce a trovare a.jar, b.jar, c.jar, come 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 hai già have this maven project source, basta installarlo nella repo locale

    mvn clean install

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

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

  3. se si don't have a pom with target jar, uno di scrittura e usare il comando superiore.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top