Как наследовать зависимость от родительского pom к дочернему pom

Я новичок в использовании maven и jenkins. Я пытаюсь наследовать зависимости от родительского pom к дочернему pom, он показывает следующие ошибки:

[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

Вот мой родительский 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>
.......

Вот мой ребенок ПОМ:

.....
<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>
......

Вот как я пытался наследовать зависимость дочернего POM от родительского 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>

Если я помещу те же зависимости в дочерний POM, он будет работать отлично. Я делаю clean install для установки и deploy для развертывания в нексусе с помощью jenkins. Я использую maven-3.3.9. В jenkins я прочитал родительский и дочерний poms в двух разных проектах maven из git. Я хочу унаследовать все зависимости и плагины от родительского POM. Является ли это возможным?


person Cherry    schedule 10.08.2016    source источник


Ответы (5)


Для этого вы должны объявить зависимости, которые хотите унаследовать, в разделе <dependencies>. <dependencyManagement> используется для определений, на которые нужно ссылаться позже, когда это необходимо, в <dependencies> конкретного дочернего элемента, чтобы они вступили в силу.

ОБНОВЛЕНИЕ: будьте осторожны при объявлении зависимостей, которые наследует каждый дочерний pom. Очень быстро вы можете получить зависимости, которые вам действительно не нужны, только потому, что они объявлены в родительском элементе. Как упоминалось другими комментаторами, <dependencyManagement> может быть лучшим выбором, хотя изначально это не то, что вы хотели.

person vempo    schedule 10.08.2016
comment
Вы имеете в виду, что в родительском pom я должен объявить все зависимости в теге ‹dependencies›, а не в ‹depenedencyManagement› или в дочернем pom? Я поместил все зависимости в теги ‹depenedencyManagement› в родительском файле pom. Это проблема? - person Cherry; 10.08.2016
comment
Если ваша цель - унаследовать определенные зависимости для всех дочерних poms без необходимости их отменять в каждом из потомков - тогда да, вы должны объявить их внутри <dependencies>, а не <dependencyManagement>. С другой стороны, зависимость, объявленная в <dependencyManagement>, может использоваться только тогда, когда она вам нужна в дочернем pom - вы просто пишете его группу и артефакт внутри этого дочернего <dependencies>. Преимущество в том, что другие свойства (версия) объявляются в родительском элементе только один раз. - person vempo; 10.08.2016
comment
Спасибо. да, моя цель - унаследовать определенные зависимости от дочерних помп. Просто чтобы убедиться, согласно вашему ответу, я помещу эти конкретные зависимости в ‹dependencies› (а не в тег ‹dependencyManagement›) в родительском pom, верно? - person Cherry; 10.08.2016
comment
А как мне вообще использовать классы родительского проекта через дочерний проект? - person John Alexander Betts; 10.09.2018

На самом деле, у вас есть 2 способа справиться с проблемой.

  1. Либо вы учитываете зависимости в родительском pom под узлом <dependencyManagement />, и в каждом дочернем элементе, который требует этого, добавляете зависимость в узел <dependencies />. Вы можете не устанавливать версию зависимости.
  2. Или вы объявляете зависимости в родительском pom в узле <dependencies />, и каждый дочерний элемент получит выгоду от зависимости.

Так, например, если вы объявите это в родительском pom:

<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>

Тогда slf4j-api будет зависимостью для всех детей. Однако вам нужно будет добавить зависимость от slf4j-simple в дочерний pom, если она потребует:

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

Для плагинов это работает так же, но с узлами <pluginManagement /> и <plugins />. Вся конфигурация может входить в определение родительского pom плагина, и вы просто объявляете плагин в разделе <build /> вашего дочернего pom.

person Arthur Noseda    schedule 10.08.2016
comment
Спасибо. Но я не могу унаследовать зависимости от родительского pom без добавления зависимости в дочернем pom в узле ‹dependencies /›, без установки версии зависимости, верно? - person Cherry; 10.08.2016
comment
Я обновил свой ответ, так как он был неточным. Оказывается, вам не нужно добавлять зависимости в дочерний pom, если вы добавляете их в узел <dependencies /> родительского pom. Это твой выбор. - person Arthur Noseda; 11.08.2016
comment
Хотя вы, безусловно, можете это сделать, но редко бывает хорошей идеей помещать <dependencies /> в родительский pom за пределами <dependencyManagement />. Все ваши дочерние модули будут постоянно наследовать все эти зависимости. Любые другие проекты, которые могут использовать один из ваших модулей, также временно получат все эти зависимости и, возможно, конфликтуют или хуже, особенно если этот дочерний модуль не использует их все. Оригинальное решение от @ArthurNosea лучше всего. - person Steve C; 11.08.2016
comment
А как мне вообще использовать классы родительского проекта через дочерний проект? - person John Alexander Betts; 10.09.2018

Ниже приведен пример того, как следует использовать родительские и дочерние помпы.

Родительский помп выглядит следующим образом:

.....
<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>
.......

Если вы укажете зависимость в теге dependencyManagement, это просто означает, что вы делаете эту банку доступной для дочернего pom. На этом этапе он НЕ будет загружать jar-файл. Дочерний pom должен будет предоставить groupId и artifactId явно для загрузки и использования jar-файла для компиляции своих классов. Примечание. Вам не нужно указывать версию зависимости в дочерних компонентах.

Детский помпон будет следующим:

.....
<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>

.......

Рекомендуется помещать зависимости, общие для всех дочерних элементов, в тег dependencyManagement родительского pom. Таким образом, вы можете управлять версиями этих зависимостей из одного места.

person RITZ XAVI    schedule 11.08.2016
comment
А как мне вообще использовать классы родительского проекта через дочерний проект? - person John Alexander Betts; 10.09.2018
comment
Разве родительский проект не типа pom? В нем не должно быть никаких занятий. - person Arthur Noseda; 11.09.2018
comment
Да, @ArthurNosea прав. Ваш родительский pom обычно имеет тип pom, а не jar или war. В идеале родительский pom не будет иметь кода. Его основная цель - вести себя как агрегатор для всех ваших детских игрушек. - person RITZ XAVI; 02.01.2019
comment
Если я хочу, чтобы произошло исключение в зависимостях при использовании в дочерних poms, могу ли я просто исключить их из родительского ‹dependencyManagement› ... ‹dependency›? - person Carlos Sanchez; 21.01.2020
comment
Если вы хотите, чтобы jar был исключен из какого-либо конкретного дочернего элемента, лучше добавить исключение к этому дочернему pom. Принимая во внимание, что если вы хотите, чтобы jar был исключен из всех дочерних pom, вы можете добавить исключение в родительский pom. - person RITZ XAVI; 21.01.2020

родительский pom.xml

<?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

<?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>.
person study_20160808    schedule 13.10.2020

Все, что добавлено в <dependencyManagement>, будет автоматически добавлено в дочерний pom. Единственное, что нужно было позаботиться о том, чтобы в дочернем pom нам не нужно было явно добавлять версию, иначе это будет другая зависимость, доступная только для дочернего модуля.

parent_pom.xml

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

child_pom.xml

        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
        </dependency>
person DHEERAJ KUMAR GUPTA    schedule 10.04.2021