2012-06-28 12 views
5

Ich habe ein Multi-Modul-Projekt in Maven, das richtig kompiliert, aber nicht richtig verpackt.So verpacken Sie mehrere Module Maven-Projekt mit verschachtelten Modulen

Im Haupt Maven pom.xml, schließe ich die Module wie folgt aus:

<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 Testquelle Bäume als separate Module kompiliert haben, weil die Kompilierung Abhängigkeiten für den Test Code unterscheidet sich von den Abhängigkeiten des Hauptquellcodes. Die Lösung besteht also darin, alle Testmodule so einzurichten, dass sie von den Hauptquellenmodulen abhängig sind, um sicherzustellen, dass sie in der richtigen Reihenfolge kompiliert werden.

Die Verzeichnisstruktur für dieses Projekt ist sehr nicht standardisiert. Ich habe die pom.xml an Orten platziert, wo ich denke, dass sie gehören. Ich kann diese Verzeichnisstruktur jedoch nicht ändern - das liegt außerhalb meiner Kontrolle. Es ist wie folgt:

/ 
+- 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 ein reguläres Quellmodul 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 Testmodul ist:

<?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> 

Da jedoch das Testmodul ein Unterverzeichnis des Hauptmoduls ist, erhalte ich die folgende Fehler, wenn es versucht, module.test zu verpacken:

[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 dieses Glas aus einem Repository holen muss, auch wenn es gebaut es nur vorher ....

Muss ich die pom.xml in module1/test auf eine übergeordnete Ebene wie die anderen verschieben? Wie kann ich das beheben, ohne die pom.xmls zu verschieben?

Dank

+0

Warum können Sie die Verzeichnisstruktur nicht ändern? Dies wird eine Menge Schmerzen mit Maven verursachen. Es ist einfacher, die Struktur in das Standard-Maven-Layout zu ändern. – khmarbaise

+0

Sind Sie sicher, dass diese 2 Module im selben Reaktor oder 'com.company: modul1: jar: 5.3.1-SNAPSHOT' im lokalen Repo installiert sind? –

+1

Ich lief dein Setup und hatte keine Probleme. Auf der anderen Seite weiß ich nicht genau, wie dein Elternteil aussieht. Könntest du das auch posten? – maba

Antwort

7

Die erste Sache ist, dass in Maven Sie verschiedene Ordner für Produktionscode und Testcode.

src/main/java 

src/test/java 

Darüber hinaus der Code in src/main/java wird von der Maven-Compiler-Plugin kompiliert werden und es ist Ziel: kompilieren während des Testcode src/test/java wird auch von der Maven-Compiler- kompiliert werden Plugin aber mit seinem Ziel: testCompile.

Wenn Sie verschiedene Abhängigkeiten für Test- und Produktions dafür Sie einen Bereich zusammen mit der Abhängigkeit wie folgt definieren:

<dependency> 
    <groupId>org.testng</groupId> 
    <artifactId>testng</artifactId> 
    <version>6.2.1</version> 
    <scope>test</scope> 
    </dependency> 

was bedeutet dies im Prüfregeln Bereich nur nutzbar sein wird und nicht verpackt werden. Wenn Sie den Bereich nicht definieren:

<dependency> 
    <groupId>org.testng</groupId> 
    <artifactId>testng</artifactId> 
    <version>6.2.1</version> 
    </dependency> 

Dies ist eine Abhängigkeit, die für die Produktion verwendet wird und verpackt werden, wenn Sie einen packging Typen wie „Krieg“ haben usw.

Ich habe etwas Ähnliches gesehen, die ich davon ausgehen, ist ein Tippfehler:

<dependencies> 
    <dependency> 
     <groupId>com.company</groupId> 
     <artifactId>modulex</artifactId> 
     <version>${product.version}-SNAPSHOT</version> 
    </dependency> 
</dependencies> 

, die einfach falsch ist, weil Sie verwenden müssen:

<dependencies> 
     <dependency> 
      <groupId>com.company</groupId> 
      <artifactId>modulex</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
    </dependencies> 

Die $ {product.version} ist nicht definiert und Sie sollten stattdessen $ {project.version} verwenden !!

Ich empfehle nicht zwei Ebenen in einem einzigen Schritt zu springen ... Sie sollten die Struktur Ihres Projekts wie folgt ändern:

/ 
+- pom.xml 
+- module1/ 
    +- pom.xml 
    +-- module1-src 
     +- pom.xml 
     +- src/main/java 
      +- com/ 
       +- company/ 
       +- Module1.java 
    +-- module1-test 
     +- pom.xml 
     +- src/ 
      +- com/ 
      +- company/ 
       +- Module1Test.java 
... 

Basierend auf der obigen Struktur, die Sie Dinge wie erhalten wird:

<modules> 
    <module>module1</module> 
    <module>module2</module> 
    ... 
    <module>moduleN</module> 
</modules> 

und in module1:

<modules> 
    <module>module1-src</module> 
    <module>module1-test</module> 
</modules> 

Otherwis Du beginnst gegen Maven zu kämpfen, wo du den Kampf verlierst.