web-dev-qa-db-fra.com

'dependencies.dependency.version' ne contient pas d'erreur, mais la version est gérée dans le parent

J'ai un projet Maven qui contient plusieurs modules. Dans Eclipse (Juno, avec m2e), il semble bien compiler. Mais lorsque je fais une installation maven sur l’un des modules, la construction échoue immédiatement.

Pom parent:

  <groupId>com.sw.system4</groupId>
  <artifactId>system4-parent</artifactId>
  <version>${system4.version}</version>
  <packaging>pom</packaging>
  <name>System 4 Parent Project</name>
  <modules>
    <module>system4-data</module>
     ...others...
  </modules>
  <properties>
    <system4.version>0.0.1-SNAPSHOT</system4.version>
    <spring.version>3.2.3.RELEASE</spring.version>
    ... others...
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
        <scope>runtime</scope>
      </dependency>
    ... lots of others ...
    </dependencies>
  </dependencyManagement>

Pom enfant:

  <parent>
    <groupId>com.sw.system4</groupId>
    <artifactId>system4-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>system4-data</artifactId>
  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <scope>runtime</scope>
    </dependency>
    ... lots of others...
  </dependencies>

Quand je construis, j'obtiens le résultat suivant:

[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR]   The project com.sw.system4:system4-data:0.0.1-SNAPSHOT (C:\work\eclips
e_workspaces\systemiv\system4-parent\system4-data\pom.xml) has 8 errors

[ERROR]     'dependencies.dependency.version' for org.springframework:spring-cor
e:jar is missing. @ line 16, column 16

... others omitted for clarity ...

Je ne comprends pas pourquoi il ne tente même pas de compiler. J'ai essayé de supprimer la portée d'exécution du parent et de l'enfant, et cela ne fait aucune différence. S'il vous plaît aider!

51
fancyplants

Quelques choses que je pense que vous pourriez essayer:

  1. Mettez la valeur littérale de la version dans le enfant pom

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.2.3.RELEASE</version>
      <scope>runtime</scope>
    </dependency>
    
  2. Effacez le cache .m2 situé normalement dans C:\Users\user.m2\repository. Je dirais que je le fais assez souvent quand je travaille dans Maven. Surtout avant de m'engager pour que je puisse être plus confiant que CI fonctionnera. Vous n'êtes pas obligé de balayer le dossier à chaque fois, parfois seulement vos packages de projet et le dossier .cache suffisent.

  3. Ajouter une balise relativePath à votre déclaration de pom parent

    <parent>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1</version>
     <relativePath>../parent/pom.xml</relativePath>
    </parent>
    

Il semble que vous ayez 8 erreurs totales dans vos poms. J'essayerais de faire fonctionner une compilation de base avant d'ajouter le pom et les propriétés du parent.

39
Brian Blain

Si quelqu'un se retrouve ici avec le même problème que moi, mon problème était que je manquais le <dependencyManagement> balises autour des dépendances que j'avais copiées à partir du pom enfant.

33
Sherms

Oui, après avoir beaucoup déchiré mes cheveux, j'ai un système de compilation.

Nettoyer la cache .m2 était une chose qui a aidé (merci à Brian)

L’une des erreurs que j’ai commises a été de placer 2 versions de chaque dépendance dans la section parent pom dependencyManagement - une avec <scope>runtime</scope> et un sans - c’était pour essayer de rendre Eclipse heureux (c’est-à-dire de ne pas afficher les erreurs de compilation non fiables) ainsi que de pouvoir s’exécuter sur la ligne de commande. C’était juste pour compliquer les choses, alors j’ai enlevé les runtime.

Définir explicitement la version du parent semblait également fonctionner (il est dommage que maven ne prenne pas davantage en charge l’utilisation de propriétés comme celle-ci!)

  <parent>
    <groupId>com.sw.system4</groupId>
    <artifactId>system4-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>

J'étais alors devenu bizarre. "Échec de la collecte des dépendances pour" des erreurs dans le module enfant pour toutes les dépendances, en disant qu'il ne pouvait pas localiser le parent - même s'il était configuré de la même façon que les autres modules qui compilaient.

J'ai finalement résolu le problème en compilant à partir du pom parent au lieu d'essayer de compiler chaque module individuellement. Cela m'a fait part d'une erreur liée à un correctif relativement simple dans un module différent, ce qui, étrangement, l'a ensuite rendue compilée.

En d'autres termes, si vous obtenez des erreurs maven relatives au module enfant A, il peut s'agir en réalité d'un problème avec le module enfant non associé Z, alors cherchez-y. (et effacez votre cache)

2
fancyplants

En théorie, maven ne permet pas d'utiliser une propriété pour définir une version parente.

Dans votre cas, maven ne peut tout simplement pas comprendre que la version 0.0.1-SNAPSHOT de votre pom parent est celle qui est actuellement dans votre projet et essaie donc de le trouver dans votre dépôt local. Il en trouve probablement un puisqu'il s'agit d'un instantané, mais il s'agit d'une ancienne version qui ne contient probablement pas votre section de gestion des dépendances.

Il existe cependant une solution de contournement:

Changez simplement la section parent dans le pom enfant avec ceci:

<parent>
    <groupId>com.sw.system4</groupId>
    <artifactId>system4-parent</artifactId>
    <version>${system4.version}</version>
    <relativePath>../pom.xml</relativePath>  <!-- this must match your parent pom location -->
</parent>
2
Yanflea

J'ai eu la même erreur, j'ai oublié d'ajouter les dépendances enfants dans le <dependencyManagement>. Par exemple dans le parent pom:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.sw.system4</groupId>
            <artifactId>system4-data</artifactId><!-- child artifact id -->
            <version>${project.version}</version>
        <dependency>

        <!-- add all third party libraries ... -->

    </dependencies>
<dependencyManagement>
1
Terran

Assurez-vous que la valeur du noeud projet/parent/version de l'enfant correspond à la valeur projet/version de son parent

0
inor

Vous devez créer le module parent avant de faire le module enfant.

0
traeper

Ce que nous venions de faire, c’était de supprimer le fichier settings.xml dans le dossier .m2: ce fichier indiquait au projet de rechercher une version de spring mvc et web inexistante.

0
Camilo