web-dev-qa-db-fra.com

Comment hériter de la dépendance d'un pom parent à un pom enfant

Je suis nouveau dans l'utilisation de Maven et de Jenkins. J'essaie d'hériter des dépendances de pom parent à pom enfant, il affiche les erreurs suivantes:

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/XMLConverters.Java:[10,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/XMLConverters.Java:[11,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/XMLConverters.Java:[15,38] cannot find symbol
  symbol:   class AbstractRequestMessageData_Type
  location: class com.td.inv.wss.util.XMLConverters
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/XMLConverters.Java:[26,23] cannot find symbol
  symbol:   class AbstractResponseMessageData_Type
  location: class com.td.inv.wss.util.XMLConverters
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/UsTermRateItemComparator.Java:[5,42] package com.rpmtec.current.UsTermRate_Type does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/UsTermRateItemComparator.Java:[7,61] cannot find symbol
  symbol: class UsTermRateItems
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/UsTermRateItemComparator.Java:[9,28] cannot find symbol
  symbol:   class UsTermRateItems
  location: class com.td.inv.wss.util.UsTermRateItemComparator
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/UsTermRateItemComparator.Java:[9,48] cannot find symbol
  symbol:   class UsTermRateItems
  location: class com.td.inv.wss.util.UsTermRateItemComparator
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[9,40] package com.fasterxml.jackson.annotation does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[10,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[11,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[12,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[13,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[14,42] package com.rpmtec.current.UsTermRate_Type does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[19,2] cannot find symbol
  symbol: class JsonIgnoreProperties
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[69,22] cannot find symbol
  symbol:   class ORCA_GETTERMHOLDINGRS_Type
  location: class com.td.inv.model.COIRQ
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[69,66] cannot find symbol
  symbol:   class RPM_GETPLANACCOUNTOVERVIEWRS_Type
  location: class com.td.inv.model.COIRQ
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/model/COIRQ.Java:[70,25] cannot find symbol
  symbol:   class ORCA_GETTERMINSTRUCTIONRS_Type
  location: class com.td.inv.model.COIRQ
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[5,26] package javax.ws.rs.client does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[6,26] package javax.ws.rs.client does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[7,26] package javax.ws.rs.client does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[8,26] package javax.ws.rs.client does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[9,24] package javax.ws.rs.core does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[15,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[16,26] package com.rpmtec.current does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[23,57] cannot find symbol
  symbol:   class AbstractRequestMessageData_Type
  location: class com.td.inv.wss.util.RPMInvoker
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/util/RPMInvoker.Java:[24,41] cannot find symbol
  symbol:   class AbstractResponseMessageData_Type
  location: class com.td.inv.wss.util.RPMInvoker
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/application/InvestmentAPI.Java:[4,19] package javax.ws.rs does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/application/InvestmentAPI.Java:[5,24] package javax.ws.rs.core does not exist
[ERROR] /D:/jenkins/workspace/CBAW/testP/WSW_Investment/src/main/Java/com/td/inv/wss/application/InvestmentAPI.Java:[9,36] cannot find symbol
  symbol: class Application

Voici mon parent POM:

.....
<modelVersion>4.0.0</modelVersion>
<groupId>group1</groupId>
<artifactId>group1-artifact</artifactId>
<version>1.0.1</version>
<packaging>pom</packaging>

<modules>
     <module>child1</module>
</modules>
.......

Voici mon enfant POM:

.....
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>group1</groupId>
    <artifactId>group1-artifact</artifactId>
    <version>1.0.1</version>
    <relativePath>(full url.....)/jenkins-parent-pom//pom.xml</relativePath>
</parent>
<groupId>group1</groupId>
<artifactId>child1</artifactId>
<version>0.0.1</version>
<packaging>war</packaging>
......

Voici comment j'ai essayé d'hériter la dépendance dans POM enfant du parent POM:

<dependencyManagement>  
  <dependencies>
    <dependency>
      <groupId>group1</groupId>
      <artifactId>group1-artifact</artifactId>
      <version>1.0.1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

Si je mets ces mêmes dépendances dans l'enfant POM, cela fonctionne parfaitement. Je fais clean install pour l'installation et deploy pour le déploiement dans Nexus à l'aide de Jenkins. J'utilise maven-3.3.9. Dans Jenkins, j'ai lu les poms parents et enfants de deux projets Maven différents de git. Je veux hériter de toutes les dépendances et plugins de POM parent. C'est possible?

35
Cherry

Pour ce faire, vous devez déclarer les dépendances dont vous souhaitez hériter dans une section <dependencies>. <dependencyManagement> Est utilisé pour les définitions qui doivent être référencées ultérieurement, le cas échéant, dans le <dependencies> D'un enfant particulier pour devenir effectives.

UPDATE : Soyez prudent lorsque vous déclarez des dépendances dont chaque pom enfant héritera. Très rapidement, vous pouvez vous retrouver avec des dépendances dont vous n'avez pas vraiment besoin simplement parce qu'elles sont déclarées dans le parent. Comme mentionné par d'autres commentateurs, <dependencyManagement> Peut être un meilleur choix, bien que ce ne soit pas ce que vous vouliez à l'origine.

51
vempo

En fait, vous avez 2 façons de régler le problème.

  1. Soit vous factorisez les dépendances dans le pom parent sous le <dependencyManagement /> noeud et dans chaque enfant qui en a besoin, ajoutez la dépendance dans le fichier <dependencies /> noeud. Vous pouvez choisir de ne pas définir la version de la dépendance.
  2. Ou vous déclarez les dépendances dans le pom parent dans le <dependencies /> noeud, et chaque enfant bénéficiera de la dépendance.

Donc, par exemple, si vous déclarez ceci dans le pom parent:

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Ensuite slf4j-api sera une dépendance pour tous les enfants. Cependant, vous devrez ajouter une dépendance à slf4j-simple dans le pom de l'enfant, devrait-il en avoir besoin:

<dependencies>
    <dependency>
        <group>org.slf4j</group>
        <artifactId>slf4j-simple</artifactId>
    </dependency>
</dependencies>

Pour les plugins, ça marche pareil, mais avec le <pluginManagement /> et <plugins /> nœuds. Toute configuration peut aller dans la définition du plugin par le pom parent, et vous déclarez simplement le plugin dans le <build /> section de votre enfant pom.

32
Arthur Noseda

Vous trouverez ci-dessous un exemple d'utilisation des poms parent et enfant.

Le parent pom est comme suit:

.....
<modelVersion>4.0.0</modelVersion>
<groupId>group1</groupId>
<artifactId>group1-artifact</artifactId>
<version>1.0.1</version>
<packaging>pom</packaging>

<modules>
     <module>child1</module>
     // add more childs here
</modules>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.abc</groupId>
            <artifactId>xyz</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>
.......

Si vous spécifiez une dépendance dans la balise dependencyManagement, cela signifie simplement que vous rendez ce fichier jar disponible pour le pom enfant. Ce serait PAS effectivement télécharger le pot à ce stade. Le pom enfant devra fournir le groupId et le artifactIdexplicitement pour télécharger et utiliser le fichier jar pour compiler ses classes. Remarque: vous n'avez pas à inclure la version de la dépendance dans les poms de l'enfant.

Le pom de l'enfant sera comme suit:

.....
<modelVersion>4.0.0</modelVersion>

<parent>            // this is how you will inherit from parent pom
    <groupId>group1</groupId>
    <artifactId>group1-artifact</artifactId>
    <version>1.0.1</version>
</parent>

<groupId>child1</groupId>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <scope>runtime</scope>
            // no version needed as it would inherit from the parent pom
        </dependency>
        <dependency>
            <groupId>org.abc</groupId>
            <artifactId>xyz</artifactId>
            // no version needed as it would inherit from the parent pom
        </dependency>
    </dependencies>

.......

C'est une bonne pratique de mettre des dépendances communes à tous les enfants dans la balise dependencyManagement du pom parent. De cette façon, vous pouvez gérer les versions de ces dépendances à partir d’un seul endroit.

18
RITZ XAVI