Wie Paket-multi-Modul-maven-Projekt mit verschachtelten Modulen
Ich habe ein multi-Modul-Projekt in Maven, die richtig kompiliert, aber erfolgt nicht Paket richtig.
In der main-maven pom.xml
habe ich auch die Module wie diese:
<modules>
<module>module1</module>
<module>module1/test</module>
<module>module2</module>
<module>module2/test</module>
...
<module>moduleN</module>
<module>moduleN/test</module>
</modules>
Im Gegensatz zu maven Konventionen, dieses Projekt hat seine test-source-trees zusammengestellt als eine separate Module, da die compile-Abhängigkeiten für den test-code unterscheiden sich von den Abhängigkeiten der Haupt-source-code. So ist die Lösung, um das setup alle test-Module abhängig von dem, was Haupt-source-Module, um sicherzustellen, Sie werden in der richtigen Reihenfolge zusammengesetzt.
Die Verzeichnis-Struktur für dieses Projekt ist sehr non-standard. Ich hängte das pom.xml's an Orten, an denen ich denke Sie gehören. Kann ich dies ändern, Verzeichnis-Struktur, aber es ist aus meiner Kontrolle. Es ist so:
/
+- pom.xml
+- module1/
+- pom.xml
+- src/
+- com/
+- company/
+- Module1.java
+- test/
+- pom.xml
+- src/
+- com/
+- company/
+- Module1Test.java
...
Hier ist, was die pom.xml für einen regulären source-Modul aussieht. Das funktioniert perfekt:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.company</groupId>
<artifactId>project</artifactId>
<version>5.3.1-SNAPSHOT</version>
</parent>
<artifactId>module1</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>modulex</artifactId>
<version>${product.version}-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<sourceDirectory>src</sourceDirectory>
<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
...
</build>
</project>
Hier ist die pom.xml für ein test-Modul:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.company</groupId>
<artifactId>project</artifactId>
<version>5.3.1-SNAPSHOT</version>
<!-- I was forced to do this because this module was 2 levels deep -->
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>module1.test</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>module1</artifactId>
<version>${product.version}-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<sourceDirectory>src</sourceDirectory>
<testSourceDirectory>src</testSourceDirectory>
<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
...
</build>
</project>
Jedoch, da das test-Modul ist ein sub-Verzeichnis des Haupt-Modul, erhalte ich den folgenden Fehler, sobald es versucht, Paket-Modul.test:
[ERROR] Failed to execute goal on project module1.test: Could not resolve dependencies for project com.company:module1.test:jar:5.3.1-
SNAPSHOT: Could not find artifact com.company:module1:jar:5.3.1-SNAPSHOT in repo1.maven.org (http://repo1.maven.org/maven2/) -> [Help 1]
Aus irgendeinem Grund, Maven denkt, dass es abrufen muss diese jar-Datei aus einem repository, auch wenn es gerade gebaut worden....
Muss ich verschieben pom.xml in module1/test auf einer übergeordneten Ebene wie die anderen? Wie kann ich dies beheben, ohne die pom.xml's?
Dank
- Warum kannst du nicht ändern Sie die Verzeichnis-Struktur??? Dies wird dazu führen, eine Menge Schmerzen, die mit Maven. Es ist einfacher zu ändern die Struktur, um die Standard-Ordner-layout von Maven.
- Sind Sie sicher, dass diese 2 Module gebaut werden, und zwar in demselben Reaktor oder
com.company:module1:jar:5.3.1-SNAPSHOT
ist für die Installation im lokalen repo? - Ich lief Ihr setup und keine Probleme gehabt. Auf der anderen Seite weiß ich nicht genau, was Ihre übergeordneten pom sieht wie. Könntest du posten, dass ein wie auch?
- Dieses enthält einige Beschreibung über geschachtelte maven-Module. Hoffe, das hilft. warpedjavaguy.wordpress.com/2011/08/08/... Sie auch unter diesem link, die erklärt, gebrochen maven-Module: github.com/tobrien/maven-invalid-modules
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die erste Sache ist, dass Maven-Sie haben verschiedene Ordner für die Produktion von code und test-code.
Außerdem den code in src/main/java", zusammengestellt von der maven-compiler-plugin und es ist Ziel: kompilieren in der Erwägung, dass der test-code src/test/java erstellt werden, auch durch das maven-compiler-plugin, aber mit dem Ziel: testCompile.
Wenn Sie verschiedene Abhängigkeiten für test und Produktion dafür können Sie einen Bereich definieren, zusammen mit der Abhängigkeit wie diese:
was bedeutet, dass dies nur verwendbar innerhalb der Test-code-Bereich und wird nicht verpackt.
Wenn Sie nicht den Umfang definieren:
Dies ist eine Abhängigkeit, die für die Produktion und verpackt werden, wenn Sie eine packging Art wie "Krieg" etc.
Ich haben gesehen eine Sache wie diese, welche ich nehme an ist eine Tippfehler:
ist schlichtweg falsch, Ursache, die Sie haben zu verwenden:
Den ${product.version} ist nicht definiert, und Sie sollten verwenden Sie ${project.version} stattdessen!
Empfehle ich, nicht zu springen, zwei Stufen in einem einzigen Schritt...
Ändern Sie die Struktur Ihres Projekts so:
Basierend auf der oben beschriebenen Struktur erhalten Sie Dinge wie:
und in module1:
Andernfalls beginnt der Kampf gegen Maven-wo verlieren Sie den Kampf.