it-swarm.com.de

Maven - Installieren von Artefakten in einem lokalen Repository im Arbeitsbereich

Ich hätte gerne eine Möglichkeit, wie 'mvn install' Dateien in einem Repository-Ordner unter meinem Quell- (Checkout-) Stamm ablegt, während Abhängigkeiten von Drittanbietern von ~/.m2/repository verwendet werden. 

Nach 'mvn install' lautet das Layout:

/work/project/
    repository
      com/example/foo-1.0.jar
      com/example/bar-1.0.jar
    foo
      src/main/Java
    bar
      src/main/Java

~/.m2/repository
    log4j/log4j/1.2/log4j-1.2.jar

(Insbesondere enthält/work/project/repository kein log4j)

Im Wesentlichen suche ich nach einer Möglichkeit, ein zusammengesetztes Repository zu erstellen, das auf andere Repositorys verweist

Meine Absicht ist es, mehrere Kassen derselben Quelle zu haben und an jeder zu arbeiten, ohne sich im lokalen Repository gegenseitig mit 'install' zu überschreiben. Mehrere Überprüfungen können auf verschiedene Zweige in cvs/svn zurückzuführen sein. In meinem Fall ist dies jedoch auf das Klonen des Master-Zweigs in git zurückzuführen (in git ist jeder Klon wie ein Zweig). Ich mag die Alternativen nicht, die eine spezielle Version/einen speziellen Klassifizierer pro Kasse verwenden oder jedes Mal, wenn ich umstelle, alles neu installieren. 

19
IttayD

Maven kann mehrere Repositorys durchsuchen (lokal, remote, "fake" remote), um Abhängigkeiten aufzulösen. Es gibt jedoch nurEINlokales Repository, in dem Artefakte während install installiert werden. Es wäre ein echter Alptraum, Artefakte an bestimmten Orten zu installieren und diese Liste beizubehalten, ohne irgendetwas zu zerbrechen. Das würde einfach nicht funktionieren, Sie möchten dies nicht tun. 

Aber TBH, ich verstehe nicht den Punkt. Warum willst du das? Möglicherweise gibt es alternative und viel einfachere Lösungen, z. B. das Installieren Ihrer Artefakte im lokalen Repository und das Kopieren dieser unter Ihrem Projektstamm. Warum sollte das nicht funktionieren? Ich würde gerne die endgültige Absicht wissen.

UPDATE: Nachdem ich das Update der ursprünglichen Frage gelesen habe, könnte ich mir die einzige Lösung vorstellen (da Sie keine anderen Versionen/Tags verwenden möchten), zwei lokale Repositorys zu verwenden und zwischen ihnen zu wechseln ( sehr fehleranfällig). 

Verwenden Sie dazu entweder unterschiedliche Benutzerkonten (da das lokale Repository standardmäßig benutzerspezifisch ist).

Oder aktualisieren Sie Ihren ~/.m2/settings.xml jedes Mal, wenn Sie wechseln möchten:

<settings xmlns="http://maven.Apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.Apache.org/SETTINGS/1.0.0
                      http://maven.Apache.org/xsd/settings-1.0.0.xsd">
  <localRepository>${user.home}/.m2/repository</localRepository>
  <!--localRepository>${user.home}/.m2/repository2</localRepository-->
  ...
</settings>

Oder haben Sie einen anderen settings.xml und zeigen Sie mit der --settings-Option darauf:

mvn install --settings /path/to/alternate/settings.xml

Oder geben Sie den alternativen Speicherort in der Befehlszeile mit der Option -Dmaven.repo.local an:

mvn -Dmaven.repo.local=/path/to/repo

Diese Lösungen sind, wie gesagt, alle fehleranfällig und keine davon ist sehr zufriedenstellend. Auch wenn Sie sehr gute Gründe haben, an mehreren Zweigen parallel zu arbeiten, ist Ihr Anwendungsfall (der nicht alles neu erstellt) nicht sehr verbreitet. Hier kann die Verwendung verschiedener Benutzerkonten die weniger schlechte Lösung IMO sein.

29
Pascal Thivent

Zu Ihrer Information: Symlinks funktionieren in Windows7 und höher. Dies ist also leicht zu erreichen, wenn der gesamte Code an derselben Stelle im lokalen Repo (d. H./Com/myco /) abgelegt wird.

geben Sie mklink für Details ein

0
teknopaul

Dies ist in der Befehlszeile INDEED möglich und ist in der Tat sehr nützlich. Wenn Sie beispielsweise ein zusätzliches Repo unter Ihrem Eclipse-Projekt erstellen möchten, müssen Sie Folgendes tun:

mvn install:install-file -DlocalRepositoryPath=repo \
   -DcreateChecksum=true -Dpackaging=jar \
   -Dfile=%2 -DgroupId=%3 -DartifactId=%4 -Dversion=%5

Dies ist der Parameter "localRepositoryPath", der Ihre Installation an ein beliebiges lokales Repo weiterleitet.

Ich habe dies in einer Batch-Datei, die ich von meinem Projektstamm aus ausführte, und es installiert die Datei in einem "Repo" -Verzeichnis innerhalb meines Projekts (daher die% -Parameter). Warum sollten Sie das tun? Nehmen wir an, Sie sind Berater für professionelle Dienstleistungen und gehen regelmäßig zu Kundenstandorten, an denen Sie gezwungen sind, ihre sicherheitsgerichteten Laptops zu verwenden. Sie kopieren Ihr eigenständiges Projekt von einem USB-Stick auf ihren Laptop, und Sie können Ihren Maven-Build problemlos erstellen.

Wenn Sie IHREN Laptop verwenden, ist es in der Regel sinnvoll, ein lokales Repo zu haben, das alles enthält. Aber für Sie, die übermütig geworden sind und Dinge wie "Warum sollten Sie das tun wollen" gesagt haben, habe ich einige Neuigkeiten ... die Welt ist ein größerer Ort mit mehr Optionen als Sie vielleicht ahnen. Wenn Sie Laptops verwenden, die NICHT Ihnen gehören, und Sie Ihr Projekt auf diesem Laptop erstellen müssen, das resultierende Artefakt erhalten und dann Ihr Projektverzeichnis (und das gerade verwendete lokale Repo) entfernen, ist dies der Weg.

Warum sollten Sie zwei lokale Repos haben? Das Standard-.m2/Repository ist das Standardprodukt der Firma, und das lokale Repo "in Projekt" ist das, wo IHR Zeug geht.

0
Ken Kopelson

Dies ist mit dem Befehlszeilenclient nicht möglich, Sie können jedoch komplexere Repository-Layouts mit einem Maven-Repository-Server wie Nexus erstellen.

Der Grund, warum dies nicht möglich ist, besteht darin, dass Maven Projekte verschachteln kann und die meisten von ihnen sich gegenseitig referenzieren. Die Installation jedes Artefakts in einem anderen Repository würde zu zahlreichen Suchvorgängen auf Ihrer lokalen Festplatte führen (oder zu fehlgeschlagenen Builds, wenn Sie eine in ein Unterprojekt einbauen).

0
Aaron Digulla