Comment package multi-module de projet maven avec imbriqué modules
J'ai un multi-module de projet Maven qui compile correctement, mais ne pas emballer correctement.
Dans les principaux maven pom.xml
, je comprend les modules suivants:
<modules>
<module>module1</module>
<module>module1/test</module>
<module>module2</module>
<module>module2/test</module>
...
<module>moduleN</module>
<module>moduleN/test</module>
</modules>
À la différence des conventions de maven, ce projet doit avoir sa source de test des arbres compilés en tant que modules distincts, car les dépendances pour compiler le code de test diffèrent des dépendances de la principale source code. Donc la solution est l'installation de tous les modules de test dépendent quelle que soit la principale source de modules pour s'assurer qu'ils sont compilés dans le bon ordre.
La structure de répertoire pour ce projet est très non-standard. J'ai mis le pom.xml's dans des endroits où je pense qu'ils appartiennent. Je ne peux pas changer cette structure de répertoire que - c'est hors de mon contrôle. Il est comme ça:
/
+- pom.xml
+- module1/
+- pom.xml
+- src/
+- com/
+- company/
+- Module1.java
+- test/
+- pom.xml
+- src/
+- com/
+- company/
+- Module1Test.java
...
Voici ce que l'pom.xml pour une source régulière module ressemble. Cela fonctionne parfaitement:
<?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>
Ici est la pom.xml pour un module de test:
<?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>
Cependant, depuis le module de test est un sous-répertoire du module principal, j'obtiens les erreurs suivantes une fois qu'il essaie de package 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]
Pour une raison quelconque, Maven pense qu'il doit chercher ce pot à partir d'un référentiel, même si il vient de construire antérieurement....
Dois-je déplacer le pom.xml dans module1/test à un niveau parent comme les autres? Comment puis-je résoudre ce problème sans avoir à déplacer le pom.xml s'?
Grâce
Êtes-vous sûr que ces 2 modules sont construits à l'intérieur même du réacteur ou
com.company:module1:jar:5.3.1-SNAPSHOT
est installé dans les locaux de pensions?J'ai couru à votre configuration, et n'avait pas de problèmes. D'autre part, je ne sais pas exactement ce que votre parent pom ressemble. Pourriez-vous poster ainsi que une?
Il contient une description sur imbriquée maven modules. Espérons que cette aide. warpedjavaguy.wordpress.com/2011/08/08/... Vous pouvez également consulter ce lien qui explique cassé maven modules: github.com/tobrien/maven-invalid-modules
OriginalL'auteur egervari | 2012-06-28
Vous devez vous connecter pour publier un commentaire.
La première chose est que, dans Maven vous avez des dossiers différents pour la production de code et de code de test.
En outre, le code dans src/main/java est compilé par le maven-compiler-plugin et c'est objectif: compiler alors que le test de code src/test/java est compilé également par le maven-compiler-plugin, mais avec son but: testCompile.
Si vous avez différentes dépendances de test et de production, à cet effet, vous pouvez définir un champ d'application ainsi que la dépendance comme ceci:
ce qui signifie que ce sera uniquement utilisable dans le code de Test de la zone et ne sera pas emballé.
Si vous ne définissez pas la portée:
C'est une dépendance qui est utilisée pour la production et seront emballés si vous avez un packging type de comme la "guerre", etc.
J'ai vu une chose comme ce qui je suppose est une faute de frappe:
qui est tout simplement une erreur, la cause que vous avez à utiliser:
${Produit.version} n'est pas défini et que vous devez utiliser ${projet.version} à la place!!
Je recommande de ne pas sauter deux niveaux au sein d'une seule étape...
Vous devriez changer la structure de votre projet comme ceci:
Basée sur la structure ci-dessus, vous obtiendrez des choses comme:
et dans module1:
Sinon, vous commencez à lutter contre Maven où vous perdrez le combat.
OriginalL'auteur khmarbaise