2010-09-03 5 views
4

J'ai un projet parent avec 5 enfants ayant aussi des dépendances entre eux. J'ai utilisé à la fois l'héritage avec l'élément <parent> dans les enfants pom.xml et l'agrégation avec l'élément <module> dans le parent.Artefact manquant lors de la construction d'un projet enfant avec Maven 2

Ma pom mère ressemble à ceci:

<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/maven-v4_0_0.xsd"> 

<modelVersion>4.0.0</modelVersion> 
<groupId>com.domain</groupId> 
<artifactId>Parent</artifactId> 
<packaging>pom</packaging> 
<version>RELEASE</version> 
<name>Parent</name> 

<modules> 
    <module>../Child1</module> 
    <module>../Child2</module> 
    <module>../Child3</module> 
    <module>../Child4</module> 
    <module>../Child5</module> 
</modules> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.domain</groupId> 
      <artifactId>Child1</artifactId> 
      <version>RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>com.domain</groupId> 
      <artifactId>Child2</artifactId> 
      <version>RELEASE</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 
</project> 

Child3 pom ressemble à ceci:

<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/maven-v4_0_0.xsd"> 

<modelVersion>4.0.0</modelVersion> 
<groupId>com.domain</groupId> 
<artifactId>Child3</artifactId> 
<name>Child3</name> 
<packaging>war</packaging> 

<parent> 
    <artifactId>Parent</artifactId> 
    <groupId>com.domain</groupId> 
    <version>RELEASE</version> 
</parent> 

<dependencies> 
    <dependency> 
     <groupId>com.domain</groupId> 
     <artifactId>Child1</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.domain</groupId> 
     <artifactId>Child2</artifactId> 
    </dependency> 
</dependencies> 
</project> 

Tout fonctionne bien quand je lance mvn install sur Parent ou Enfant1. Mais quand je l'exécute sur Child3 je reçois les erreurs suivantes:

Qu'est-ce qui ne va pas avec mon installation?

Répondre

6

Je n'essaierai pas vraiment de résoudre le problème de votre approche actuelle, mais plutôt de couvrir ce que je considère comme la meilleure pratique dans ce cas. Sentez-vous libre d'adopter ou non :)

Tout d'abord, s'il vous plaît noter que le RELEASE (et LATEST) est un mot-clé spécial (pas sûr que vous êtes au courant de cela) et RELEASE est en quelque sorte mal utilisé ici (un parent avec un version définie à RELEASE n'a pas vraiment de sens). Quoi qu'il en soit, ces mots-clés spéciaux étaient une mauvaise idée et sont déconseillés (je ne suis pas sûr qu'ils sont supportés dans Maven3) pour des raisons de reproductibilité, évitez simplement de les utiliser.

Alors, utilisez une version snapshot si le projet est en cours de développement au lieu-à-dire modifier le parent comme celui-ci:

<project> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.domain</groupId> 
    <artifactId>Parent</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <name>Parent</name> 

    <modules> 
    <module>../Child1</module> 
    <module>../Child2</module> 
    <module>../Child3</module> 
    <module>../Child4</module> 
    <module>../Child5</module> 
    </modules> 

</project> 

Notez que j'ai enlevé l'élément dependencyManagement, je ne pense pas qu'il fournit beaucoup de valeur ajoutée pour internes dépendances d'une construction de modules multiples et recommandons d'utiliser les ${project.groupId} et l'${project.version} propriétés intégrées au lieu quand les déclarant:

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
    <artifactId>Parent</artifactId> 
    <groupId>com.domain</groupId> 
    <version>1.0-SNAPSHOT</version><!-- must hard code this --> 
    </parent> 

    <!--groupId>com.domain</groupId--><!-- you can skip this, you inherit it --> 
    <artifactId>Child3</artifactId> 
    <packaging>war</packaging> 

    <name>Child3</name> 

    <dependencies> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>Child1</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>Child2</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    </dependencies> 
</project> 

Comme je l'ai écrit, je ne pense pas en utilisant dependencyManagement est vraiment utile pour interne dépendances et c'est ainsi que je configure mes projets. Mais tu peux si tu veux. Utilisez simplement les propriétés pour ne pas répéter les informations.

+0

Le problème vient vraiment de l'utilisation de RELEASE comme numéro de version. Merci Pascal. – Damien

Questions connexes