Scaricare tutte le dipendenze di Maven in una directory NON nel repository?


127

Ho iniziato a convertire il mio progetto in Maven perché avevo bisogno di usare una libreria che era distribuita in forma binaria solo su Maven, ma dopo aver sbattuto la testa contro il muro per troppo tempo ho deciso di smettere di farmi del male e usare solo Formica. Vorrei solo che Mven scaricasse il vaso e tutte le sue dipendenze transitive in una directory di mia scelta, così posso semplicemente controllarli nel mio SCM come di solito mi diverto ed essere di nuovo uno sviluppatore beato.
Qualche idea su come farlo facilmente?


2
Prendi in considerazione l'utilizzo di Ivy e ottieni la gestione delle dipendenze transitiva di cui hai bisogno, con la formica di cui ti fidi. Oppure mordi il proiettile e usa la struttura delle directory di Maven.
Dave Newton,

Hai provato Ivy ?
Tomasz Nurkiewicz,

5
No, ma ho passato tutta la mia pazienza a passare a questo punto. Forse la prossima volta. Voglio tornare alla programmazione. Può essere fatto con Maven?
Chubbsondubs,

Risposte:


260

Il plug-in di dipendenza Maven può potenzialmente risolvere il tuo problema.

Se hai un pomcon tutte le dipendenze del tuo progetto specificate, tutto ciò che dovresti fare è eseguire

mvn dependency:copy-dependencies

e troverai la target/dependenciescartella piena di tutte le dipendenze, inclusa quella transitiva.

Aggiunta della risposta di Gustavo dal basso : per scaricare le fonti di dipendenza , è possibile utilizzare

mvn dependency:copy-dependencies -Dclassifier=sources

(tramite Apache Maven Dependency Plugin doc ).


1
Grazie @Raghuram, lo cerco da anni.
eskalera,

ma se volessi copiare tutte le dipendenze nel mio repository locale? Questo dovrebbe essere usato per? Perché copiarlo se forse si trova già nel repository locale. È comunque locale.
ses

1
@ses Una build standard maven (ad es. compilazione, test, pacchetto, installazione, ecc .; non sono sicura di convalidare) copia già tutte le dipendenze nel repository locale per impostazione predefinita. Questo non è per quello. Invece è per le situazioni in cui hai bisogno delle dipendenze della tua app per qualsiasi motivo. Lo sto usando in questo momento per ispezionare le librerie dipendenti alla ricerca di definizioni API ridondanti (ad esempio alcune librerie includeranno API Javax, che possono entrare in conflitto con altre versioni della stessa API), ma è anche utile se l'app necessita delle sue dipendenze impacchettate con essa per la distribuzione, o qualunque cosa.
Spanky Quigman,

1
+1 per una risposta chiara, concisa e utile. Ho appena passato la stessa danza Maven dell'OP e volevo solo recuperare le dipendenze dei file JAR. Grazie! Vorrei poter fare +10
Brandon

@Raghuram Tecnicamente finisci con tutti gli artefatti (risolti) in "target / dipendenze". Inoltre, esiste il potenziale problema delle collisioni di nomi poiché la coordinata "groupId" di una dipendenza viene ignorata. In altre parole, "dipendenza: copia-dipendenze" non preserva la struttura del layout.
whaefelinger,

8

Sulla base della risposta di @Raghuram , trovo un tutorial sulla copia delle dipendenze dei progetti , solo:

  1. Apri il tuo pom.xmlfile di progetto e trova questo:

    <project>
      [...]
      <build>
        <plugins>
          ...
        </plugins>
      </build>
      [...]
    </project>
    
  2. Di sostituire il <plugins> ... </plugins>con:

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>false</overWriteSnapshots>
              <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
    
  3. E chiama maven dalla riga di comando mvn dependency:copy-dependencies

Al termine, creerà la cartella target/dependencyall'interno di tutte le jardipendenze della directory corrente in cui pom.xmlrisiede.


Dove devo digitare il comando "mvn"? Fare clic destro maven-project-> Maven -> .. ??
Cotto a metà il

In una riga di comando del terminale nella cartella in cui si trova il pom.xmlfile.
utente

1
Non ha funzionato Penso che Maven sia installato solo come plugin. Ho dovuto scaricare manualmente anche Maven. Quindi ha mvn dependency:copy-dependenciesfunzionato!
Cotto a metà

8

Alla fine ho capito come usare Maven. Da Eclipse, crea un nuovo progetto Maven.

Scarica Maven, estrai l'archivio, aggiungi la /bincartella al percorso.

Convalida l'installazione dalla riga di comando eseguendo mvn -v(stamperà la versione e il percorso di installazione di Java)

Passare alla cartella principale del progetto (dove pom.xmlsi trova) ed eseguire:

mvn dependency:copy-dependencies

Tutti i file jar vengono scaricati su /target/dependency.

Per impostare un'altra directory di output:

mvn dependency:copy-dependencies -DoutputDirectory="c:\temp"

Ora è possibile riutilizzare questo progetto Maven per tutti i download di dipendenze modificando pom.xml

Aggiungi vasi al progetto Java per percorso di compilazione -> configura percorso di compilazione -> librerie -> aggiungi JAR ..


1
Non deve essere necessariamente un progetto di eclissi. Ho aperto un file jar in Java Decompiler e copiato pom.xml in una cartella vuota. Ho chiamato mvn dependency:copy-dependenciescome hai descritto da quella cartella e ho ottenuto tutti i file jar dipendenti ben copiati in una singola cartella.
Bernhard Döbler,


2

Si prega di verificare se ci sono alcuni file di configurazione nella ${MAVEN_HOME}/confdirectory come settings.xml. Tali file sovrascrivono le impostazioni dalla .m2cartella e, a causa di ciò, la cartella del repository da .m2potrebbe non essere visibile o scartata.

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.