Как наследовать зависимость от родительского помона к дочернему пом
Я новичок в использовании 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>
.......
Вот мой ребенок 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>
......
Вот как я пытался унаследовать зависимость в дочернем 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
для развертывания в Nexus с помощью Jenkins. Я использую Maven-3.3.9. В jenkins я читал родительские и дочерние poms в двух разных проектах maven из git. Я хочу унаследовать все зависимости и плагины от родительского POM. Является ли это возможным?
6 ответов
Вы должны объявить зависимости, которые вы хотите наследовать под <dependencies>
раздел для достижения этого. <dependencyManagement>
используется для определений, на которые необходимо ссылаться позже, когда это необходимо, в пределах <dependencies>
конкретного ребенка, чтобы стать эффективным.
ОБНОВЛЕНИЕ: Будьте осторожны при объявлении зависимостей, которые будут наследовать каждый дочерний pom. Очень быстро вы можете получить зависимости, которые вам не нужны, только потому, что они объявлены в родительском элементе. Как уже упоминалось другими комментаторами, <dependencyManagement>
может быть лучшим выбором, хотя это не то, что вы хотели изначально.
На самом деле, у вас есть 2 способа решения проблемы.
- Либо вы учитываете зависимости в родительском пом
<dependencyManagement />
узел и в каждом дочернем, который этого требует, добавить зависимость в<dependencies />
узел. Вы можете не устанавливать версию зависимости. - Или вы объявляете зависимости в родительском pom в
<dependencies />
узел, и каждый ребенок получит выгоду от зависимости.
Так, например, если вы объявите это в родительском пом:
<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
в помпе ребенка, если это потребуется:
<dependencies>
<dependency>
<group>org.slf4j</group>
<artifactId>slf4j-simple</artifactId>
</dependency>
</dependencies>
Для плагинов это работает так же, но с <pluginManagement />
а также <plugins />
узлы. Вся конфигурация может идти в определении плагина родительского pom, и вы просто объявляете плагин в <build />
раздел вашего ребенка пом.
Ниже приведен пример использования родительских и дочерних помпонов.
Родительский пом выглядит следующим образом:
.....
<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>
<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, это просто означает, что вы делаете этот jar доступным для дочернего pom. Это на самом деле не будет загружать банку в этот момент. Дочерний 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>
.......
Родительский 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>.
Что бы ни добавлялось в
<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>
В дополнение к другим ответам я хочу добавить сюда несколько обобщенных моментов, касающихся объявления зависимостей. Есть 2 раздела, связанных с зависимостями,
- управление зависимостями: просто список определений зависимостей (ничего не включено в фактическую сборку или выходные данные сборки). Мы можем определить версию здесь.
- зависимость: любая включенная сюда зависимость попадает в сборку, а также включается в выходные данные (в соответствии с областью действия). Если мы имеем в виду какую-либо зависимость, объявленную в разделе управления зависимостями, нам не нужно упоминать здесь версию. Но если мы здесь упомянем версию, то она доминирует.
Таким образом, и родительский, и дочерний элементы могут иметь эти 2 раздела.
- Parent.dependentmanagement: список зависимостей (упомянутых вместе с версией), на которые могут ссылаться все подпроекты без упоминания версии, но только идентификаторы групп и артефактов.
- родительский.зависимость: список зависимостей, которые автоматически наследуются всеми подпроектами (может использоваться для общих зависимостей, таких как junit)
- child.dependentmanagement: список зависимостей (без упоминания версии), на которые могут ссылаться его подпроекты (если таковые имеются).
- child.dependent: список зависимостей, поставляемых с этим подмодулем.
Подводя итог, мы упоминаем версию в управлении родительскими зависимостями, мы можем использовать эту зависимость с идентификатором группы и артефакта везде, если только мы не хотим явно использовать какую-либо другую версию.