Maven: Come includere i jar, che non sono disponibili nelle ripetizioni, in un progetto J2EE?


100

nel mio progetto J2EE ho un paio di dipendenze, che non sono disponibili in nessun repository Maven, perché sono librerie proprietarie. Queste librerie devono essere disponibili in fase di esecuzione, quindi devono essere copiate nella destinazione /.../ WEB-INF / lib ...

In questo momento, li sto elencando come dipendenza di sistema nel mio POM, ma con questo metodo il problema è che non vengono copiati nella build di destinazione durante la compilazione. Anche questo metodo non è molto elegante.

Allora qual è il modo migliore per integrarli in Maven?

Nota: non voglio creare il mio repository Maven.


7
Penso davvero che dovresti rivedere la tua decisione di creare un repository Maven. Non è affatto difficile e ne vale la pena al 100%.
Robert Munteanu

7
Il valore della creazione di un repository Maven dipende dalle circostanze.
yincrash

Risposte:


54

Come hai detto, non vuoi creare il tuo repository, forse questo ti aiuterà.

È possibile utilizzare l' obiettivo file di installazione di maven-install-plugin per installare un file nel repository locale. Se crei uno script con una chiamata Maven per ogni file e lo tieni accanto ai jar, tu (e chiunque altro abbia accesso) puoi facilmente installare i jar (e i file pom associati) nel loro repository locale.

Per esempio:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

o semplicemente

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

È quindi possibile fare riferimento alle dipendenze normalmente nel progetto.

Tuttavia, la soluzione migliore è ancora quella di configurare un repository remoto interno e consiglierei di utilizzare Nexus da solo. Può essere eseguito sulla tua casella di sviluppo, se necessario, e il sovraccarico è minimo.


1
Grazie, questo metodo funziona bene per me ora. Ho esteso il POM in modo che i file vengano installati automaticamente nel rappresentante locale: pastebin.ca/1504318
samson

Felice di aiutare, ma come altri hanno già detto l'approccio migliore sarebbe quello di utilizzare un gestore di repository Maven. Questo approccio non si adatta bene.
Rich Seller

4
Il comando che ha funzionato per me: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
Mazrick

193

Per le persone che desiderano una soluzione rapida a questo problema:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

assegna semplicemente alla tua libreria un ID di gruppo e un nome di artefatto univoci e punta a dove si trova nel file system. Sei bravo ad andare.

Ovviamente questa è una soluzione rapida e sporca che funzionerà SOLO sulla tua macchina e se non cambi il percorso delle librerie. Ma a volte, è tutto ciò che vuoi, correre e fare alcuni test.

EDIT: ho appena riscritto la domanda e ho realizzato che l'utente stava già utilizzando la mia soluzione come soluzione temporanea. Lascio la mia risposta come aiuto rapido per gli altri che vengono a questa domanda. Se qualcuno non è d'accordo con questo, lasciami un commento. :)


4
Freddo. C'è un modo per specificare un URL invece del percorso di una macchina locale?
phreakhead

3
Grazie per un esempio completo e funzionante !!! Spero che tu catturi un pesce rosso e ti esaudisca tre desideri. :)
johndodo

14
Questa dovrebbe essere la risposta accettata in quanto è autonoma (in pom.xml)
Vikram

2
Ciao Rajarshee, gli ID di gruppo e artefatto sono completamente arbitrari. Il percorso del tuo jar nel file system è tutto ciò che conta perché funzioni. Perché in realtà il barattolo non è una dipendenza esperta, stai solo dicendo a Maven di trattarlo come tale.
Ric Jafe

1
A partire dal 2016 questo non sembra funzionare. La build riconosce il percorso ma non include il codice nel jar ombreggiato. Ratti ...
markthegrea

24

Crea una cartella di repository nel tuo progetto. Prendiamo

${project.basedir}/src/main/resources/repo

Quindi, installa il tuo jar personalizzato in questo repository:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

Infine, aggiungi le seguenti definizioni di repo e dipendenze ai progetti pom.xml:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>

1
Questo ha funzionato molto bene per me. PS Suggerirei una directory diversa per il repository locale in quanto metterlo in "src" non mi sembra corretto (non è fonte!)
davidfrancis

1
Ha funzionato come un fascino. Sto migrando un vecchio progetto da Ant a Maven e ci sono alcune librerie che non riesco a trovare nei repository web.
Paulo Pedroso

Attenzione: quando il valore per -DlocalRepositoryPath non termina con /(ovvero, indica una cartella), il repository viene creato con groupId. Es: se l'ID del gruppo è foo.come localRepositoryPath è repo, la cartella del repository diventa repo.foo.com.
Sheshadri Mantha

Questa procedura è come un progetto locale alla gestione del repository di sistema utilizzando lo strumento di automazione della compilazione Maven utilizzato principalmente per i progetti Java e il file system.
Oleksii Kyslytsyn

8

È necessario configurare un repository locale che ospiterà tali librerie. Ci sono molti progetti che fanno esattamente questo. Ad esempio Artifactory .


4
Un punto sulla terminologia, quelli sono repository remoti interni, non repository locali. Il repository locale è quello in cui vengono scaricate le dipendenze del file system locale.
Rich Seller

3

Nessuna delle soluzioni funziona se stai usando la build Jenkins !! Quando pom viene eseguito all'interno del server di compilazione Jenkins, queste soluzioni falliranno, poiché Jenkins eseguirà pom tenterà di scaricare questi file dal repository aziendale.

Copia i jar in src / main / resources / lib (crea la cartella lib). Faranno parte del tuo progetto e andranno fino al server di distribuzione. Nel server di distribuzione, assicurati che gli script di avvio contengano src / main / resources / lib / * in classpath. Viola.


2

puoi installarli in un repository locale privato (es. m2 / repository nella tua home directory): maggiori dettagli qui


7
Sì, potrei farlo, ma poi dovrei dire a tutti coloro che vogliono costruire il progetto che devono mettere i file X, Y nella directory Z e questo complica davvero le cose. Dopotutto, voglio usare Maven per semplificare il processo di compilazione.
Sansone

2

Se ho capito bene, se quello che vuoi fare è esportare le dipendenze durante la fase di compilazione in modo che non sia necessario recuperare manualmente ogni libreria necessaria, puoi usare mojo copy-dependencies .

Spero che possa essere utile nel tuo caso ( esempi )


2

La soluzione di @Ric Jafe è ciò che ha funzionato per me.

Questo e 'esattamente quello che stavo cercando. Un modo per spingerlo attraverso il codice di test di ricerca. Nulla di bello. Sì, lo so che è quello che dicono tutti :) Le varie soluzioni di plugin di Maven sembrano essere eccessive per i miei scopi. Ho alcuni vasi che mi sono stati dati come librerie di terze parti con un file pom. Voglio che si compili / funzioni rapidamente. Questa soluzione che ho adattato banalmente a Python ha funzionato a meraviglia per me. Tagliato e incollato nel mio pom. Il codice Python / Perl per questa attività si trova in questa domanda e risposta: posso aggiungere jars al percorso di classe build di maven 2 senza installarli?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

La soluzione precedente restituisce 'dependencies.dependency.systemPath' per xx.jar non deve puntare ai file all'interno della directory del progetto. Vedere stackoverflow.com/questions/10935135/...
sarah.ferguson


1

L'installazione da sola non ha funzionato per me.

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.