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