67 votes

Comment hériter des dépendances d'un pom parent vers un pom enfant ?

Je suis nouveau dans l'utilisation de maven et de jenkins. J'essaie d'hériter des dépendances du pom parent au pom enfant, mais les erreurs suivantes apparaissent :

[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 POM parent :

.....
<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 de la dépendance dans le POM enfant à partir du POM parent :

<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 le POM enfant, cela fonctionne parfaitement. Je fais clean install pour installer et deploy pour le déploiement dans Nexus en utilisant Jenkins. J'utilise maven-3.3.9. Dans jenkins, j'ai lu les poms parent et enfant dans deux projets maven différents depuis git. Je veux hériter de toutes les dépendances et plugins du POM parent. Est-ce possible ?

91voto

vempo Points 2101

Vous devez déclarer les dépendances dont vous voulez hériter sous une rubrique <dependencies> pour y parvenir. <dependencyManagement> est utilisé pour les définitions qui doivent être référencées ultérieurement, à chaque fois que cela est nécessaire, au sein de l'application <dependencies> d'un enfant particulier pour devenir effectif.

UPDATE : Faites attention 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, même si ce n'est pas ce que vous vouliez à l'origine.

0 votes

Vous voulez dire que, dans le pom parent, je dois déclarer toutes les dépendances dans la balise <dependencies>, et non dans <depenedencyManagement> ou dans le pom enfant ? J'ai mis toutes les dépendances dans les balises <depenedencyManagement> dans la pom parent. Est-ce un problème ?

19 votes

Si votre objectif est d'hériter de dépendances particulières à tous les poms enfants, sans avoir besoin de les déclarer dans chacun des enfants, alors oui, vous devez les déclarer dans le cadre de <dependencies> et non <dependencyManagement> . D'autre part, une dépendance déclarée au sein de <dependencyManagement> ne peut être utilisé que lorsque vous en avez besoin dans un pom enfant - il suffit d'écrire son groupe et son artefact dans le pom enfant. <dependencies> . L'avantage étant que les autres propriétés (version) ne sont déclarées qu'une seule fois dans le parent.

0 votes

Merci. Oui, mon but est d'hériter de dépendances particulières aux poms enfants. Juste pour être sûr, selon votre réponse, je mettrai ces dépendances particulières dans <dependencies> (pas dans le tag <dependencyManagement> ) dans le pom parent, n'est-ce pas ?

52voto

Arthur Noseda Points 1541

En fait, vous avez deux façons de traiter le problème.

  1. Soit vous factorisez les dépendances dans le pom parent sous la rubrique <dependencyManagement /> et dans chaque enfant qui le requiert, ajoutez la dépendance dans le noeud <dependencies /> nœud. Vous pouvez choisir de ne pas définir la version de la dépendance.
  2. Ou bien vous déclarez les dépendances dans le pom parent dans la section <dependencies /> et chaque enfant bénéficiera de cette 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>

Puis slf4j-api sera une dépendance pour tous les enfants. Cependant, vous devrez ajouter une dépendance sur slf4j-simple dans le pompon de l'enfant, s'il en a besoin :

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

Pour les plugins, cela fonctionne de la même manière, mais avec l'option <pluginManagement /> y <plugins /> nœuds. Toute la configuration peut aller dans la définition du plugin dans le pom parent, et il suffit de déclarer le plugin dans la section <build /> section de votre enfant pom.

0 votes

Merci. Mais il n'y a aucun moyen d'hériter des dépendances du pom parent sans ajouter la dépendance dans le pom enfant dans le noeud <dependencies />, sans définir la version de la dépendance, n'est-ce pas ?

0 votes

J'ai mis à jour ma réponse car elle n'était pas exacte. Il s'avère que vous n'aurez pas besoin d'ajouter des dépendances dans le pom de l'enfant si vous les ajoutez dans le pom de l'enfant. <dependencies /> du pom parent. C'est votre choix.

1 votes

Bien que vous puissiez certainement le faire, c'est rarement une bonne idée de mettre <dependencies /> dans un pom parent en dehors de <dependencyManagement /> . Tous vos modules enfants hériteront de toutes ces dépendances en permanence. Tous les autres projets qui pourraient consommer l'un de vos modules obtiendront aussi transitoirement toutes ces dépendances et éventuellement des conflits ou pire, en particulier si ce module enfant ne les utilise pas tous. La solution originale de @ArthurNoseda est la meilleure.

29voto

RITZ XAVI Points 1656

Vous trouverez ci-dessous un exemple de la manière dont vous devez utiliser les poms parent et enfant.

Le pom parent 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 le champ dependencyManagement étiquette, il signifie simplement que vous mettez ce bocal à la disposition de l'enfant pom . Il faudrait PAS télécharger le jar à ce stade. Le pom enfant devra fournir le groupId et le artifactId explicitement pour télécharger et utiliser le jar pour compiler ses classes. Note : il n'est pas nécessaire d'inclure la version de la dépendance dans les poms enfants. .

Le pom pom enfant sera le suivant :

.....
<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 les dépendances communes à tous les enfants dans le fichier dependencyManagement de l'étiquette du pom parent. De cette façon, vous pouvez gérer les versions de ces dépendances à partir d'un seul endroit.

0 votes

Et comment puis-je faire pour utiliser les classes du projet parent à travers le projet enfant ?

0 votes

Le projet parent n'est-il pas de type pom ? Il ne devrait pas y avoir de classes dedans.

0 votes

Oui, @ArthurNoseda a raison. Votre pom parent est généralement de type pom au lieu d'un jar ou d'un war. Idéalement, le pom parent n'aura pas de code. Son but principal est de se comporter comme un agrégateur pour tous vos pom enfants.

4voto

study_20160808 Points 55

Pom.xml parent

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
    </parent>

    <groupId>com.ll</groupId>
    <artifactId>parent-module</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <!-- child will inherit all content -->
    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.11.0</version>
        </dependency>
    </dependencies>

    <!-- child will inherit only version-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.5.7</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <modules>
        <module>sub-module1</module>
        <module>sub-module2</module>
    </modules>
</project>

pom.xml enfant

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         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.ll</groupId>
        <artifactId>parent-module</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.ll</groupId>
    <artifactId>sub-module1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
    </dependencies>
</project>

1.child will use zookeeper:3.5.7, the version is from parent pom.xml <dependencyManagement>:<dependencies>:<dependency>. 

2.child will use protobuf-java:3.11.o, it is from parent pom.xml <dependencies>:<dependency>.

1voto

Tout ce qui est ajouté dans <dependencyManagement> sera automatiquement ajouté dans le pom de l'enfant. La seule chose dont il faut s'occuper est que dans le pom de l'enfant, nous n'avons pas besoin d'ajouter la version explicitement, sinon ce sera une autre dépendance disponible uniquement pour le module enfant.

parent_pom.xml

    <dependencyManagement>
      <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
     </dependencies>
  </dependencyManagement>

enfant_pom.xml

        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
        </dependency>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X