Alle Maven-Abhängigkeiten in ein Verzeichnis herunterladen, das sich NICHT im Repository befindet?

127

Ich begann mein Projekt in Maven umzuwandeln, weil ich eine Bibliothek verwenden musste, die nur in binärer Form über Maven verteilt war, aber nachdem ich meinen Kopf viel zu lange gegen die Wand geschlagen hatte, beschloss ich, mich nicht mehr zu verletzen und nur zu benutzen Ameise. Ich möchte nur, dass Maven das JAR und alle seine transitiven Abhängigkeiten in ein Verzeichnis meiner Wahl herunterlädt, damit ich sie einfach in mein SCM einchecken kann, wie es mir normalerweise Spaß macht, und wieder ein glückseliger Entwickler sein kann.
Irgendwelche Ideen, wie man das einfach macht?

Chubbsondubs
quelle
2
Erwägen Sie die Verwendung von Ivy und erhalten Sie das erforderliche transitive Abhängigkeitsmanagement mit der Ant, der Sie vertrauen. Oder beißen Sie in die Kugel und verwenden Sie die Maven-Verzeichnisstruktur.
Dave Newton
Hast du es mit Ivy versucht ?
Tomasz Nurkiewicz
5
Nein, aber ich habe meine ganze Geduld damit verbracht, an diesem Punkt zu wechseln. Vielleicht nächstes Mal. Ich möchte wieder zum Codieren zurückkehren. Kann man das mit Maven machen?
Chubbsondubs

Antworten:

260

Das Maven-Abhängigkeits-Plugin kann möglicherweise Ihr Problem lösen.

Wenn Sie eine pommit all Ihren Projektabhängigkeiten angegeben haben, müssen Sie nur ausführen

mvn dependency:copy-dependencies

und Sie finden den target/dependenciesOrdner mit allen Abhängigkeiten, einschließlich Transitiv.

Hinzufügen der Antwort von Gustavo von unten : Zum Herunterladen der Abhängigkeitsquellen können Sie verwenden

mvn dependency:copy-dependencies -Dclassifier=sources

(über das Apache Maven Dependency Plugin doc ).

Raghuram
quelle
1
Thx @Raghuram, ich habe seit Ewigkeiten danach gesucht.
Eskalera
aber was ist, wenn ich alle Abhängigkeiten in mein lokales Repo kopieren möchte? Dafür soll es verwendet werden? Warum kopieren, wenn es vielleicht schon im lokalen Repo ist? Es ist sowieso lokal.
Ses
1
@ses Ein Standard-Maven-Build (z. B. Kompilieren, Testen, Paketieren, Installieren usw .; nicht sicher, ob er validiert werden soll) kopiert bereits standardmäßig alle Abhängigkeiten in Ihr lokales Repo. Das ist nicht dafür. Stattdessen ist es für Situationen gedacht, in denen Sie die Abhängigkeiten Ihrer App aus irgendeinem Grund benötigen. Ich verwende es gerade, um die abhängigen Bibliotheken auf redundante API-Definitionen zu untersuchen (z. B. enthalten einige Bibliotheken Javax-APIs, die mit anderen Versionen derselben API in Konflikt stehen können), aber es ist auch gut, wenn Ihre App ihre Abhängigkeiten benötigt zur Verteilung oder was auch immer.
Spanky Quigman
1
+1 für eine klare, präzise und hilfreiche Antwort. Ich habe gerade denselben Maven-Tanz wie das OP durchlaufen und wollte nur die JAR-Dateiabhängigkeiten abrufen. Vielen Dank! Ich wünschte, ich könnte +10
Brandon
@Raghuram Technisch gesehen haben Sie alle (aufgelösten) Artefakte in "Ziel / Abhängigkeiten". Ferner besteht das potenzielle Problem von Namenskollisionen, wenn die "groupId" -Koordinate einer Abhängigkeit ignoriert wird. Mit anderen Worten, "Abhängigkeit: Kopierabhängigkeiten" behält die Layoutstruktur nicht bei.
Whaefelinger
8

Basierend auf der Antwort von @Raghuram finde ich ein Tutorial zum Kopieren von Projektabhängigkeiten . Nur:

  1. Öffnen Sie Ihre Projektdatei pom.xmlund finden Sie diese:

    <project>
      [...]
      <build>
        <plugins>
          ...
        </plugins>
      </build>
      [...]
    </project>
  2. Dann ersetzen Sie die <plugins> ... </plugins>durch:

    <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. Und rufen Sie maven in der Kommandozeile an mvn dependency:copy-dependencies

Nach Abschluss wird der Ordner target/dependencyin allen jarAbhängigkeiten des aktuellen Verzeichnisses erstellt, in dem sich das Verzeichnis befindet pom.xml.

Benutzer
quelle
Wo gebe ich den Befehl "mvn" ein? Rechtsklick maven-project-> Maven -> .. ??
Gebacken in der Hälfte
In einer Terminal-Befehlszeile in dem Ordner, in dem sich die pom.xmlDatei befindet.
Benutzer
1
Hat nicht funktioniert. Ich denke, Maven ist nur als Plugin installiert. Ich musste Maven auch manuell herunterladen. Dann hat mvn dependency:copy-dependenciesfunktioniert!
Gebacken in der Hälfte
8

Ich habe endlich herausgefunden, wie man Maven benutzt. Erstellen Sie in Eclipse ein neues Maven-Projekt.

Laden Sie Maven herunter, extrahieren Sie das Archiv und fügen Sie den /binOrdner dem Pfad hinzu.

Überprüfen Sie die Installation über die Befehlszeile, indem Sie Folgendes ausführen mvn -v(druckt die Version und den Java-Installationspfad).

Wechseln Sie in den Projektstammordner (wo pom.xmlsich dieser befindet) und führen Sie Folgendes aus:

mvn dependency:copy-dependencies

Alle JAR-Dateien werden heruntergeladen /target/dependency.

So legen Sie ein anderes Ausgabeverzeichnis fest:

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

Jetzt ist es möglich, dieses Maven-Projekt für alle Abhängigkeits-Downloads wiederzuverwenden, indem Sie die Datei pom.xml ändern

Fügen Sie dem Java-Projekt Jars hinzu, indem Sie den Erstellungspfad erstellen -> den Erstellungspfad konfigurieren -> Bibliotheken -> JARs hinzufügen.

In der Hälfte gebacken
quelle
1
Muss nicht unbedingt ein Eclipse-Projekt sein. Ich habe eine JAR-Datei in Java Decompiler geöffnet und die Datei pom.xml in einen leeren Ordner kopiert. Ich habe angerufen, mvn dependency:copy-dependencieswie Sie es aus diesem Ordner beschrieben haben, und alle abhängigen JAR-Dateien in einen einzigen Ordner kopiert.
Bernhard Döbler
4

Ich habe den nächsten Befehl gefunden

mvn dependency:copy-dependencies -Dclassifier=sources

hier maven.apache.org

Gustavo
quelle
2

Bitte überprüfen Sie, ob Sie einige Konfigurationsdateien im ${MAVEN_HOME}/confVerzeichnis wie haben settings.xml. Diese Dateien überschreiben die Einstellungen aus dem .m2Ordner. Aus diesem Grund ist der Repository-Ordner aus .m2möglicherweise nicht sichtbar oder wird nicht verworfen.

MagGGG
quelle