Was ist der Unterschied zwischen "mvn deploy" für ein lokales Repo und "mvn install"?

95

Mein Team verwendet ein internes Team-Maven-Repo, das von einem Entwicklungsserver mit Apache gemeinsam genutzt wird. Wir führen auch den Continuum CI-Server auf demselben Computer aus. Maven-Builds in Continuum werden mit dem Ziel "install" ausgeführt, das das endgültige Artefakt direkt in das freigegebene Verzeichnis kopiert.

Die Frage ist, was ist der Unterschied zwischen dem Hinzufügen von Dateien zum freigegebenen Repo mvn installmithilfe des Bereitstellungsziels (mvn-deploy-Plugin)?

Es scheint mir, dass die Verwendung mvn deployzusätzliche Konfigurationsprobleme verursacht, aber ich habe irgendwo gelesen, dass die Installation von Dateien in einem gemeinsam genutzten Repo aus irgendeinem Grund im Zusammenhang mit der internen Funktionsweise von maven eine schlechte Idee ist.

Update: Ich bekomme die funktionalen Unterschiede zwischen deployund install; Ich interessiere mich eigentlich mehr für die Details auf niedriger Ebene in Bezug darauf, welche Dateien im Maven-Repo erstellt werden.

Ken Liu
quelle

Antworten:

166

Ken, gute Frage. Ich sollte im Definitiven Leitfaden genauer auf den Unterschied eingehen. "Installieren" und "Bereitstellen" dienen zwei verschiedenen Zwecken in einem Build. "Installation" bezieht sich auf den Prozess der Installation eines Artefakts in Ihrem lokalen Repository. "Bereitstellen" bezieht sich auf den Prozess des Bereitstellens eines Artefakts in einem Remote-Repository.

Beispiel:

  1. Wenn ich ein großes Projekt mit mehreren Modulen auf meinem Computer ausführe, führe ich normalerweise "mvn install" aus. Dadurch werden alle generierten binären Software-Artefakte (normalerweise JARs) in meinem lokalen Repository installiert. Wenn ich dann einzelne Module im Build erstelle, ruft Maven die Abhängigkeiten aus dem lokalen Repository ab.

  2. Wenn es an der Zeit ist, Snapshots oder Releases bereitzustellen, werde ich "mvn deploy" ausführen. Wenn Sie dies ausführen, wird versucht, die Dateien auf einem Remote-Repository oder -Server bereitzustellen. Normalerweise werde ich auf einem Repository-Manager wie Nexus bereitstellen

Es ist richtig, dass für die Ausführung von "Bereitstellen" eine zusätzliche Konfiguration erforderlich ist. Sie müssen einen Abschnitt "DistributionManagement" in Ihrem POM bereitstellen.

Tim O'Brien
quelle
@ Tim also was genau ist der Vorteil von mvn deploy? Welche Vorteile bietet es für die zusätzliche Konfiguration, die überhaupt erforderlich war?
Geek
4
Deploy wurde entwickelt, um Artefakte auf einem Remote-Server bereitzustellen. Es ist ein völlig anderer Anwendungsfall als bei der Installation.
Tim O'Brien
17

Aus den Maven-Dokumenten geht hervor , dass es nur ein Unterschied ist, in welchem Repository Sie das Paket installieren:

  • install - Installiert das Paket im lokalen Repository, um es als Abhängigkeit in anderen Projekten lokal zu verwenden
  • Bereitstellen - Wird in einer Integrations- oder Release-Umgebung ausgeführt und kopiert das endgültige Paket in das Remote-Repository, um es für andere Entwickler und Projekte freizugeben.

Vielleicht gibt es einige Verwirrung darin, dass "Installation" auf dem CI-Server es in seinem lokalen Repository installiert, das Sie als Benutzer dann teilen?

matt b
quelle
4

"matt b" hat es richtig, aber um genau zu sein, kopiert das "install" -Ziel Ihr erstelltes Ziel in das lokale Repository auf Ihrem Dateisystem. Nützlich für kleine Änderungen in Projekten, die derzeit nicht für die gesamte Gruppe bestimmt sind.

Das Ziel "Bereitstellen" lädt es in Ihr freigegebenes Repository hoch, wenn Ihre Arbeit beendet ist, und kann dann von anderen Personen freigegeben werden, die es für ihr Projekt benötigen.

In Ihrem Fall scheint es , dass „Install“ verwendet wird , um die Verwaltung der Bereitstellung einfacher zu machen , da lokale Repo - CI ist das gemeinsame Repo. Wenn sich CI auf einer anderen Box befindet, muss das Ziel "Bereitstellen" verwendet werden.

Spencer Kormos
quelle