Wie zu beheben Abhängigkeiten zwischen Module in multi-Modul-Projekt?
Nach der Arbeit mit Maven für eine Weile, ich bin Total begeistert von den vielen Funktionen, die Maven bringt in der Bau-Architektur, insbesondere das dependency-management. Allerdings habe ich eine Frage wieder und wieder - wie Maven Abhängigkeiten zwischen multi-module-Projekten. Ich Frage mich, ob dies ist das große Manko des aktuellen Maven-Implementierung und/oder wenn es eine befriedigende Lösung.
Sagen wir, ich habe ein multi-Modul-Maven-Projekt. Das Parent-pom enthält drei Module -- moduleA (jar), moduleB (jar), und moduleC(Krieg). B ist abhängig von A und C abhängt B. Einfach genug? Jetzt, wo ich laufen will mvn dependency:go-offline
am übergeordneten Projekt, die angeblich zu lösen alle Abhängigkeiten auf und bringen Sie ins lokal .m2 Verzeichnis. Es schlägt fehl, da Maven beschwert sich, dass es nicht lösen kann, Abhängigkeit für moduleA, wenn es agiert auf moduleB. Da alle diese Module gehören zu einer Gruppen-id, die ich auch versuchen, Sie zu verwenden -DexcludeGroupIds=x.y.z
auszuschließen diese Modul-Abhängigkeiten, aber es immer noch nicht am gleichen Punkt.
Verstehe ich, warum Maven beschwert sich - moduleA ist noch nicht gebaut und somit gibt es keine moduleA:jar-Artefakt in meinem lokalen oder internen repository beim gehen-offline-Ziel ausgeführt wird. Aber IMHO sollte das plugin behandeln diese inter-Modul-Abhängigkeiten unterschiedlich. In diesem Fall sollte es einfach ignorieren. Könnte man argumentiert, dass ich kann einfach nicht mvn clean install
die Installation moduleA:jar in das lokale repository. Danach läuft mvn dependency:go-offline
wird sicher arbeiten. Aber das workaround Niederlagen der Zweck dieser go-offline-Ziel. Dieses plugin ermöglicht es uns, zu lösen und ziehen Sie die Abhängigkeiten in unserem lokalen repository ohne Gebäude das gesamte Projekt. Ich verwendet dependency:copy-dependencies
Ziel in einem anderen Fall, und es hat das gleiche Problem.
Ich lief auch ähnliche Problem in anderen Szenarien: "mvn clean generieren-source" konnte nicht aufgelöst Abhängigkeiten. Bei mir lief mvn clean compile
funktioniert alles einwandfrei, aber wenn ich ran mvn clean generate-source
es schlägt fehl, da Maven sich nicht beheben, inter-Modul-Abhängigkeit. In diesem Fall, die verursacht wurde durch @requiresDependencyResolution
im antrun-plugin.
Da beide antrun-plugin-dependency-plugin sind sehr beliebt in der Maven-Welt, ich bin sicher ich bin nicht der einzige, haben, laufen Sie in dieser Ausgabe. Jeder findet irgendeine Lösung/workaround?
InformationsquelleAutor der Frage Lan | 2013-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bezweifle, dass eine solche Funktionalität wäre schon mal möglich mit Maven. Während Ihrer Projekte einen gemeinsamen Elternteil und voneinander abhängig sind, Maven nicht möglich zu wissen, wo Sie diese Projekte, um Sie zu bauen. Es kann auch nicht feststellen, ob die Projekte, die gerade gebaut werden müssen, oder ob Sie angegeben haben, die falsche Versionsnummer für Ihre Abhängigkeit.
InformationsquelleAutor der Antwort Duncan Jones
Maven hat das Konzept einer "Reaktor", wo Artefakte, die gebaut haben, in einem einzigen Lauf (z.B.
maven package
) sind verfügbar für die Auflösung von Abhängigkeiten während des build. Zum Beispiel, wenn Ihre Abhängigkeit von den Graphen ergibt sich die Reihenfolge für Erstellung " moduleA moduleB moduleC, und Sie tunmvn package
Maven bauen moduleA, Paket seine Artefakt und fügen Sie ihn in den Reaktor, dann bauen moduleB packen und fügen Sie ihn in den Reaktor, dann das gleiche für moduleC. Dies bedeutet moduleB hat Zugang zu moduleA - Artefakt für die Auflösung von Abhängigkeiten, und moduleC hat Zugang zu moduleA und moduleB. Dies funktioniert nur, wenn die Artefakte sind tatsächlich gebaut, d.h. wenn Sie das Paket ausführen Ziel.Das problem ist, dass, wenn Sie nicht das Paket ausführen Ziel weil Sie nicht daran interessiert, die Artefakte (wie für Ihre
dependency:go-offline
Beispiel), Artefakte für die Module, die verarbeitet worden sind, nicht gebaut werden und somit nicht in den Reaktor. Ich finde das auch unangenehm; ich denke, Maven, sollte einen Blick auf die POM-Dateien in der Liste der Module zu bauen und dort zu suchen; aber es funktioniert nicht.Kurz gesagt, die Lösung zu Ihrem problem zu tun
mvn package dependency:go-offline
. Diese wird nicht installiert Artefakte in Ihrem lokalen repository (was ich glaube, ist sehr schlechte Praxis), aber es wird setzen Sie Sie in den Reaktor für die Dauer der build, was bedeutet, dass Maven wird in der Lage sein, um Abhängigkeiten aus Ihrem moduleB der moduleA, die bereits gebaut worden. Der Nachteil ist, dass jedes Modul wird getestet und verpackt, das ist eine Menge Arbeit, wenn alles, was Sie wollten zu tundependency:go-offline
.So oder so, hoffe das hilft.
InformationsquelleAutor der Antwort Frans
Ihnen erklärt, warum es nicht funktioniert, so dass Sie die Probleme verstehen. Das problem ist, dass es Stoppt, wenn Sie nicht finden können, A.jar aber das wird nur geschehen, wenn Sie zu Haus B. es gibt Also eine Art, die manchmal nützliche Strategie.
Müssen Sie Durcheinander mit Ein von sich selbst. Nur A. Verwenden Sie Ihren plan der laden von Abhängigkeiten und dann Bau es.
Einmal baut, können Sie auf verschieben, um das gleiche zu tun, mit B und dann C. Schritt für Schritt.
Eine Sache zu erinnern ist hier, dass es manchmal ok zu bauen B mit einen alten Schnappschuss von Einem im lokalen repo. Sie brauchen nur den neuen snapshot von Einem bauen in der repo, wenn es änderungen an der Signatur oder neue Sachen benötigt, von B.
Gibt es einige Diskussionen auch hier: Maven-Module + Aufbau eines Einzelnen Moduls
Einer endgültig nicht, dass in der Regel diese Art von Fragen kommen auf, wenn Menschen baut, die zu lange dauern. Es gibt mehrere Möglichkeiten zu machen, baut schneller gehen:
InformationsquelleAutor der Antwort Lee Meador
Habe ich erstellt ein JIRA-ticket mit einem Beispiel-Projekt hier:
https://issues.apache.org/jira/browse/MDEP-516
Bitte für ihn abstimmen.
InformationsquelleAutor der Antwort Petar Tahchiev