2012-06-28 22 views
5

Mam projekt wielomodułowy w Maven, który kompiluje się poprawnie, ale nie pakuje się prawidłowo.Jak spakować projekt wielomodułowy z modułami zagnieżdżonymi

W głównym Maven pom.xml, ja obejmować moduły tak:

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

przeciwieństwie do konwencji maven, projekt ten ma mieć jego badań źródłowych drzew skompilowane jako oddzielnych modułów, ponieważ w zależności kompilacji dla testu kod różni się od zależności głównego kodu źródłowego. Rozwiązaniem jest więc ustawienie wszystkich modułów testowych tak, aby były zależne od głównych modułów źródłowych, aby zapewnić, że są one kompilowane we właściwej kolejności.

Struktura katalogów dla tego projektu jest bardzo niestandardowa. Umieściłem plik pom.xml w lokalizacjach, w których moim zdaniem należą. Nie mogę jednak zmienić tej struktury katalogów - jest poza moją kontrolą. To jest tak:

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

Oto, jak wygląda pom.xml dla zwykłego modułu źródłowego. Działa to doskonale:

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

Oto pom.xml dla modułu testowego:

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

Jednakże, ponieważ moduł testowy jest sub-katalogu głównego modułu, otrzymuję następujący błędy raz próbuje zapakować module.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] 

z jakiegoś powodu, Maven myśli, że musi pobrać ten słoik z repozytorium, choć to właśnie zbudował go wcześniej ....

Czy muszę przenieść pom.xml w module1/test na poziom nadrzędny, jak inne? Jak mogę to naprawić bez przenoszenia plików pom.xml?

Dzięki

+0

Dlaczego nie można zmienić struktury katalogów? Spowoduje to wiele bólu z Mavenem. Łatwiej jest zmienić strukturę na domyślny układ folderów Mavena. – khmarbaise

+0

Czy jesteś pewien, że te 2 moduły są zbudowane w tym samym reaktorze, czy w lokalnym repo jest zainstalowany "com.company: module1: jar: 5.3.1-SNAPSHOT"? –

+1

Uruchomiłem konfigurację i nie miałem żadnych problemów. Z drugiej strony nie wiem dokładnie, jak wygląda twój rodzic. Czy możesz to opublikować? – maba

Odpowiedz

7

Pierwszą rzeczą jest to, że w Maven masz różne foldery dla produkcji kodu i kodu testowego.

src/main/java 

src/test/java 

Ponadto kod w src/main/java będą sporządzane przez maven-compiler-plugin i to jest cel: opracować natomiast kod testowy src/test/java będą sporządzane również przez Maven-compiler- wtyczka, ale z jej celem: testCompile.

Jeśli mają różne zależności dla badań i produkcji nich można zdefiniować zakres wraz z zależnością tak:

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

co oznacza ten będzie użyteczny tylko w obszarze kodu testu i nie będą pakowane. Jeśli nie określają zakres:

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

Jest to zależność, który jest używany do produkcji i będzie pakowany jeśli masz typ packging jak „wojny” etc.

Widziałem coś takiego które zakładam jest literówka:

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

który jest po prostu błędne, bo trzeba użyć:

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

$ {product.version} nie jest zdefiniowany i powinieneś użyć $ {project.version} zamiast !!

polecam nie skakać na dwóch poziomach w obrębie jednego kroku ... należy zmienić strukturę projektu tak:

/ 
+- 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 
... 

Na podstawie powyższej struktury dostaniesz takie rzeczy jak:

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

aw Module1:

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

przeciwnym razie istnieje Zaczynasz walczyć z Mavenem, w którym przegrasz walkę.

Powiązane problemy