Maven installare e distribuire 3rd dipendenze del partito con una semplice linea di comando
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
omvn 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
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 simvn install
omvn 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
-
Se hai già
have this maven project source
, basta installarlo nella repo localemvn clean install
-
se
have the jar and the pom of it
, installare vaso con pommvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom
-
se si
don't have a pom with target jar
, uno di scrittura e usare il comando superiore. -
se non è possibile recuperare il file pom di esso, può essere si dovrebbe rinunciare.