Maven nicht erkennt Module Geschwister wenn mvn Abhängigkeit ausgeführt wird: Baum
-
16-09-2019 - |
Frage
Ich versuche, ein Multi-Modul Maven Projekt einzurichten und die Zwischenmodulabhängigkeiten werden offenbar nicht richtig eingerichtet werden.
ich habe:
<modules>
<module>commons</module>
<module>storage</module>
</modules>
in der Mutter POM (die eine Verpackung vom Typ POM hat)
und dann Unterverzeichnisse commons/
und storage/
die JAR poms mit dem gleichen Namen definiert werden.
Speicher hängt von Commons.
Im Haupt (Master) Verzeichnis, betreibe ich mvn dependency:tree
und sehen:
[INFO] Building system
[INFO] task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] domain:system:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] Building commons
[INFO] task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
...correct tree...
[INFO] ------------------------------------------------------------------------
[INFO] Building storage
[INFO] task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar
[INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.
Missing:
----------
1) domain:commons:jar:1.0-SNAPSHOT
Warum wird die Abhängigkeit von „commons“ nicht bestanden, auch wenn der Reaktor es offensichtlich gesehen hat, weil sie die Abhängigkeit Baum erfolgreich verarbeitet? Es sollte auf jeden Fall nicht zum Netz gehen werden, um es zu finden, da es direkt, es gibt ...
Die pom für die Lagerung:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<parent>
<artifactId>system</artifactId>
<groupId>domain</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>domain</groupId>
<artifactId>storage</artifactId>
<name>storage</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- module dependencies -->
<dependency>
<groupId>domain</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- other dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Vielen Dank für Ihre Anregungen!
(Edit)
Um zu klären, was ich hier bin auf der Suche ist: Ich will nicht haben Modul X zu installieren Modul Y zu bauen, die auf X abhängt, da beide Module aus dem gleichen übergeordneten POM verwiesen. Dies macht intuitiv Sinn für mich, wenn ich zwei Dinge in dem gleichen Quellbaum habe, soll ich nicht Zwischenprodukte installieren muß, um den Build fortzusetzen. Hoffentlich mein Denken macht einen Sinn hier ...
Lösung
Ich denke, das Problem ist, dass, wenn Sie eine Abhängigkeit angeben Maven es als Glas haben erwartet (oder was auch immer) verpackt ist und von mindestens einem lokalen Repo. Ich bin sicher, dass, wenn Sie mvn install
auf commons Projekt zunächst alles laufen wird funktionieren.
Andere Tipps
Wie in diesem Maven Mailingliste Thread diskutiert die Abhängigkeit: Baum Ziel selbst werden die Dinge sehen im Repository, anstatt den Reaktor. Sie können von mvn Installation dieses Problem umgehen, wie zuvor vorgeschlagen, oder etwas weniger beschwerlich zu tun, die den Reaktor, wie
rufenmvn compile dependency:tree
Funktioniert für mich.
Aus dieser Erkenntnis heraus ist ein älterer Thread, aber es scheint, dass entweder das Werkzeug entwickelt oder könnte dies beim ersten Mal verpasst haben.
Es ist möglich, einen Build ausführen, die Abhängigkeiten, ohne die Installation, indem Sie einen Reaktor zu bauen gelöst macht.
Wenn Sie Ihren Build in der übergeordneten beginnen, die die Modulstruktur des Projekts beschreibt dann Abhängigkeiten zwischen Modulen wird während des Build sich über den internen Maven Reaktor aufgelöst werden.
Natürlich ist dies nicht die perfekte Lösung, da es nicht den Build eines einzelnen Moduls innerhalb der Struktur löst. In diesem Fall Maven nicht die Abhängigkeiten in seinem Reaktor hat und Biene sucht es im Repository zu lösen. Also für einzelne baut haben Sie immer noch zuerst die Abhängigkeiten installieren.
Hier finden Sie einige Referenz diese Situation zu beschreiben.
für mich, was auf diesen Thread führte ich war ein ähnliches Problem und die Lösung war, alle Modulabhängigkeits Poms hatte, um sicherzustellen,
<packaging>pom</packaging>
Die Eltern hatten
pom
mein Modell dep hatte pom - so gibt es kein Glas gefunden werden
.Das einzige, was für mich workd: Umschalten auf Gradle: (
Ich habe
Parent
+---dep1
+---war1 (using dep1)
und ich kann nur cd in WAR1 und verwenden mvn tomcat7: run-Krieg. Ich muß immer vor, das gesamte Projekt installieren, trotz WAR1 seine Eltern verweist und die übergeordneten Referenzen WAR1 und dep1 (als Module), so sollten alle Abhängigkeiten bekannt sein.
Ich verstehe nicht, was das Problem ist.
In einer Maven Modulstruktur wie folgt aus:
- parent
- child1
- child2
Sie werden in der parent
pom
haben diese:
<modules>
<module>child1</module>
<module>child2</module>
</modules>
Wenn Sie hängen jetzt von child1
in child2
durch die folgenden in Ihrem <dependencies>
in child2
setzen:
<dependency>
<groupId>example</groupId>
<artifactId>child1</artifactId>
</dependency>
In Kürze erhalten Sie eine Fehlermeldung erhalten, dass die JAR für child1
nicht gefunden werden kann. Dies kann durch die Deklaration eines <dependencyManagement>
Blockes einschließlich child1
im pom
für parent
gelöst werden:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>example</groupId>
<artifactId>child1</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
child1
wird nun gebaut werden, wenn Sie ein compile
oder package
usw. Ziel auf parent
laufen und child2
wird child1
die kompilierten Dateien finden.
beantworten von Don Willis :
Wenn Ihr Build erstellte Test-Gläser Testcode unter Ihrem Reaktor Submodule teilen sollten Sie verwenden:
mvn test-compile dependency:tree
die dependency:tree
erlauben bis zur Fertigstellung in diesem Fall ausgeführt werden.
Stellen Sie sicher, dass das Modul, das in der pom aufgelöst wird versagt, zeigt auf die rechts Eltern durch die Konfigurationen in der pom-Datei des Moduls einschließlich.