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
InformationsquelleAutor egervari | 2012-06-28
Schreibe einen Kommentar