Maven: aggiungi una dipendenza a un jar per percorso relativo

Ho un barattolo proprietario che voglio aggiungere al mio pom come dipendenza.

Ma non voglio aggiungerlo a un repository. Il motivo è che voglio che i miei soliti comandi di mvn compile come mvn compile , ecc., mvn compile fuori dagli schemi. (Senza chiedere agli sviluppatori di aggiungerlo a qualche repository da soli).

Voglio che il jar si trovi in ​​una lib di terze parti nel controllo del codice sorgente e ci colleghi al relativo percorso dal file pom.xml.

Può essere fatto? Come?

Voglio che il jar si trovi in ​​una lib di terze parti nel controllo del codice sorgente e ci colleghi al relativo percorso dal file pom.xml.

Se si vuole veramente questo (capire, se non è ansible utilizzare un repository aziendale), il mio consiglio sarebbe quello di utilizzare un “repository di file” locale per il progetto e non utilizzare una dipendenza con ambito del system . Il system deve essere evitato, tali dipendenze non funzionano bene in molte situazioni (ad esempio in assemblea), causano più problemi che benefici.

Quindi, invece, dichiara un repository locale per il progetto:

   my-local-repo file://${basedir}/my-repo   

Installa la tua localRepositoryPath terze parti lì utilizzando install:install-file con il parametro localRepositoryPath :

 mvn install:install-file -Dfile= -DgroupId= \ -DartifactId= -Dversion= \ -Dpackaging= -DlocalRepositoryPath= 

Aggiornamento: Sembra che install:install-file ignori localRepositoryPath quando si utilizza la versione 2.2 del plug-in. Tuttavia, funziona con la versione 2.3 e successive del plug-in. Quindi usa il nome completo del plugin per specificare la versione:

 mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \ -Dfile= -DgroupId= \ -DartifactId= -Dversion= \ -Dpackaging= -DlocalRepositoryPath= 

documentazione di maven-install-plugin

Infine, dichiaralo come qualsiasi altra dipendenza (ma senza l’ambito del system ):

  your.group.id 3rdparty XYZ  

Questo è IMHO una soluzione migliore rispetto all’utilizzo di un ambito di system quanto la dipendenza verrà trattata come un buon cittadino (ad esempio, sarà inclusa in un assembly e così via).

Ora, devo menzionare che il “modo giusto” per affrontare questa situazione in un ambiente aziendale (forse non è il caso qui) sarebbe quello di utilizzare un repository aziendale.

Utilizzando l’ambito del system . ${basedir} è la directory del tuo pom.

  .. .. system ${basedir}/lib/dependency.jar  

Tuttavia, è consigliabile installare il jar nel repository e non commetterlo su SCM, dopotutto è ciò che Maven tenta di eliminare.

Questo è un altro metodo in aggiunta alla mia precedente risposta a Posso aggiungere i jar a maven 2 build classpath senza installarli?

Questo supererà il limite quando si usano build multi-modulo specialmente se il JAR scaricato è referenziato in progetti figlio al di fuori del genitore. Ciò riduce anche il lavoro di installazione creando i file POM e SHA1 come parte della build. Inoltre, consente al file di risiedere in qualsiasi parte del progetto senza correggere i nomi o seguendo la struttura del repository Maven.

Questo utilizza il plugin di installazione di Maven. Affinché ciò funzioni, è necessario impostare un progetto multi-modulo e disporre di un nuovo progetto che rappresenti la build per installare i file nel repository locale e assicurarsi che uno sia il primo.

Il tuo progetto multi-modulo pom.xml sarà simile a questo:

 pom   repository ... other modules ...  

Il file repository / pom.xml conterrà quindi le definizioni per caricare i JAR che fanno parte del progetto. Di seguito sono riportati alcuni frammenti del file pom.xml.

 repository pom 

La confezione pom impedisce di eseguire test o compilare o generare file jar. La carne di pom.xml si trova nella sezione di compilazione in cui viene utilizzato il plugin maven-install-plugin.

    org.apache.maven.plugins maven-install-plugin   com.ibm.db2:db2jcc verify  install-file   com.ibm.db2 db2jcc 9.0.0 jar ${basedir}/src/jars/db2jcc.jar true true   ...     

Per installare più di un file, aggiungi altre esecuzioni.

Ho già scritto su uno schema per farlo.

È molto simile alla soluzione proposta da Pascal, anche se sposta tutte queste dipendenze in un modulo di repository dedicato in modo da non doverlo ripetere ovunque venga utilizzata la dipendenza se si tratta di una build multi-modulo.

Questo funziona per me: diciamo che ho questa dipendenza

  com.company.app my-library 1.0 system ${project.basedir}/lib/my-library.jar  

Quindi, aggiungi manualmente il percorso class per la dipendenza del sistema in questo modo

 libs/my-library-1.0.jar 

Configurazione completa:

  org.apache.maven.plugins maven-jar-plugin 2.4    ${jdk.version} ${project.name} ${project.version} ${project.name} Library ${project.version} libs/my-library-1.0.jar   true com.company.app.MainClass libs/      org.apache.maven.plugins maven-dependency-plugin 2.5.1   copy-dependencies package  copy-dependencies   ${project.build.directory}/libs/     

siamo passati al gradle e questo funziona molto meglio in gradle;). specifichiamo solo una cartella in cui possiamo rilasciare i jar per situazioni temporanee come quella. Abbiamo ancora la maggior parte dei nostri vasi definiti nella tipica sezione di gestione delle dipendenze (ad esempio la stessa di Maven). Questa è solo un’altra dipendenza che definiamo.

quindi, in pratica, ora possiamo solo rilasciare qualsiasi jar che vogliamo nella nostra cartella lib per i test temporanei, se non è un repository di Maven da qualche parte.

Fondamentalmente, aggiungi questo al pom.xml:

 ...   lib_id file://${project.basedir}/lib   ...  ...  com.mylibrary mylibraryname 1.0.0  ...  

Una piccola aggiunta alla soluzione pubblicata da Pascal

Quando ho seguito questa rotta, ho ricevuto un errore in Maven durante l’installazione di jar Ojdbc.

 [INFO] --- maven-install-plugin:2.5.1:install-file (default-cli) @ validator --- [INFO] pom.xml not found in ojdbc14.jar 

Dopo aver aggiunto -DpomFile, il problema è stato risolto.

 $ mvn install:install-file -Dfile=./lib/ojdbc14.jar -DgroupId=ojdbc \ -DartifactId=ojdbc -Dversion=14 -Dpackaging=jar -DlocalRepositoryPath=./repo \ -DpomFile=~/.m2/repository/ojdbc/ojdbc/14/ojdbc-14.pom 

Puoi utilizzare eclipse per generare un Jar eseguibile: file Jar di esportazione / eseguibile