2010-09-04 15 views
25

Ho già trovato una risposta qui su Stack Overflow su come includere un JAR di terze parti in un progetto senza installarlo in un "repository locale":Avere un barattolo di terze parti incluso nel barattolo ombreggiato Maven senza aggiungerlo al repository locale

Can I add jars to maven 2 build classpath without installing them?

Ma, quando uso il plugin Ombra Maven per creare un JAR che include tutte le dipendenze del progetto, nonché, il 3 ° JAR partito non è incluso automaticamente.

Come posso fare in modo che Maven Shade Plugin aggiunga un JAR di terze parti al JAR ombreggiato?


Come per la risposta ottenuta, l'ho fatto funzionare. Quello che ho fatto è stato, ha aggiunto questo frammento di codice all'inizio del mio pom.xml:

<repositories> 
    <repository> 
    <id>repo</id> 
    <url>file://${basedir}/repo</url> 
    </repository> 
</repositories> 

poi aggiunti una dipendenza per il mio progetto, anche a pom.xml:

<dependencies> 
    <dependency> 
    <groupId>dummy</groupId> 
    <artifactId>dummy</artifactId> 
    <version>0.0.0</version> 
    <scope>compile</scope> 
    </dependency> 
</dependencies> 

E poi corse un comando linea per aggiungere un pacchetto a 'repo':

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file 
    -Dfile=<my-jar>.jar -DgroupId=dummy -DartifactId=dummy 
    -Dversion=0.0.0 -Dpackaging=jar -DlocalRepositoryPath=`pwd`/repo/ 

(. non sono sicuro se il percorso di pronti contro termine deve essere un percorso completo, ma non ha voluto correre rischi)

Il contenuto della sottodirectory pronti contro termine è ora:

repo/dummy/dummy/0.0.0/dummy-0.0.0.jar 
repo/dummy/dummy/0.0.0/dummy-0.0.0.pom 
repo/dummy/dummy/maven-metadata-local.xml 

ora posso controllare questo per il controllo di versione, e non hanno dipendenze locali o remoti.

risposta

30

Tuttavia, quando uso il Maven Shade Plugin per creare un JAR che include anche tutte le dipendenze del progetto, il JAR di terze parti non viene incluso automaticamente.

Sì, perché i system dipendenze con ambito si presume essere sempre presente (questo è esattamente ciò che il campo di applicazione è di circa system) in modo che non sarà incluso. Le persone in realtà non capiscono che cosa siano le dipendenze dello scope system, continuano a maltrattarle (sì, questo è un abuso), e poi ottengono effetti collaterali e si chiedono perché (come ha sottolineato Brian nel suo answer).

ho già scritto many, many, reallymany volte su questo qui su SO e nel 99% dei casi, system dipendenze con ambito dovrebbero essere evitati. E ti ripeto quello che la mini guida Dependency Scopes dice ancora una volta:

  • system: Questa dipendenza è necessario in qualche fase del ciclo di vita del progetto, ma è specifico del sistema. L'uso di questo ambito è sconsigliato: questo è considerato un tipo "avanzato" di funzionalità e dovrebbe essere usato solo quando comprendi veramente tutte le implicazioni del suo utilizzo, che può essere estremamente difficile se non addirittura impossibile da quantificare. Questo ambito per definizione rende la tua build non portatile. Potrebbe essere necessario in alcuni casi limite. L'ambito del sistema include l'elemento <systemPath> che punta alla posizione fisica di questa dipendenza sul computer locale.Viene quindi usato per riferirsi ad alcuni artefatti che dovrebbero essere presenti sulla macchina locale data e non in un repository; e il cui percorso può variare da macchina a macchina. L'elemento systemPath può fare riferimento alle variabili di ambiente nel suo percorso: ${JAVA_HOME} per esempio.

Così, invece di utilizzare il system campo di applicazione, sia:

  • Aggiungi le librerie al repository locale tramite install:install-file. Questo è un modo rapido e sporco per far funzionare le cose, potrebbe essere un'opzione se sei da solo ma rende la tua build non portabile.
  • Installare ed eseguire un "repository enterprise" come Nexus, Archiva o Artifactory e aggiungere le librerie tramite deploy:deploy-file. Questo è lo scenario ideale.
  • Imposta un repository basato su file come descritto in this previous answer e inserisci le tue librerie. Questo è il migliore compromesso se non si dispone di un repository aziendale, ma è necessario lavorare come una squadra e non si vuole sacrificare la portabilità.

Per favore, smettere di usare lo scope system.

+12

Il problema non è che la gente * come * di utilizzare il metodo sbagliato, o lo fanno per la gente dispetto - il problema è che nessuno di questa roba è documentata in modo chiaro e ricette sono date su internet per raggiungere queste cose. È impossibile coinvolgere le persone grossolane nella creazione di "repository aziendali" o utilizzare Maven come non avendo documentazione per i casi comuni che le persone incontrano, troveranno sempre un modo. – Nakedible

+0

@Nakedible Bene, immagino che tu abbia ragione riguardo alla documentazione di una soluzione pratica. Per quanto riguarda lo scope 'system', forse i Maven dovrebbero rendere più chiaro che non è una soluzione aggiungere dipendenze" casuali "a una build. Ma lo scopo 'system' è [documentato] (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope). –

+8

un altro problema è che non esiste un modo semplice per usare i jar locali: ammettilo, l'ambito del sistema potrebbe essere sbagliato e far muovere le persone di mente corrotta, ma i principianti devono portare le cose al lavoro. un progetto è previsto per domani, 10 minuti, e ho bisogno di un vaso ombreggiato pronto per allora. dover creare un repo fa rotolare i miei occhi all'indietro nella mia testa. –

12

The Maven addjars plug risolve questo problema - si veda

http://code.google.com/p/addjars-maven-plugin/wiki/UsagePage

+0

unfortanetelly needs Maven 3.0.3 –

+0

@Daniel vuoi dire che hai bisogno almeno di Maven 3.0.3 o che non funzioni con le versioni più recenti? Maven 3.0.3 è stato rilasciato nel 2011-03-04 https://maven.apache.org/docs/history.html se non è possibile eseguire che si hanno problemi seri! Guardando addjars non è stato rilasciato dal 2012 http://mvnrepository.com/artifact/com.googlecode.addjars-maven-plugin/addjars-maven-plugin –

+0

intendo 3.0.3+. Sì, ho seri problemi con l'uso di eclipse indigo, ovvero il connettore m2e ha una versione inferiore e non è in grado di aggiornarsi. –

1

Usato <risorse> per includere la mia lib con tutti i vasi. vale a dire:

<build> 
    <resources> 
     <resource> 
      <directory>${project.basedir}</directory> 
      <includes> 
       <include>lib/*.jar</include> 
      </includes> 
     </resource> 
    </resources> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <createDependencyReducedPom>false</createDependencyReducedPom> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
Problemi correlati