Maven 如何将依赖项从父pom继承到子pom
我在使用maven和jenkins方面是新手。我试图将依赖项从父pom继承到子pom。它显示以下错误:Maven 如何将依赖项从父pom继承到子pom,maven,jenkins,parent-pom,Maven,Jenkins,Parent 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/XMLConvert
[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>
.......
<dependencyManagement>
<dependencies>
<dependency>
<groupId>group1</groupId>
<artifactId>group1-artifact</artifactId>
<version>1.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
。。。。。
4.0.0
第一组
第一组伪影
1.0.1
聚甲醛
孩子1
.......
这是我的孩子波姆:
.....
<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>
......
。。。。。
4.0.0
第一组
第一组伪影
1.0.1
(完整url…)/jenkins parent pom//pom.xml
第一组
孩子1
0.0.1
战争
......
下面是我如何尝试从父POM继承子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>
.......
<dependencyManagement>
<dependencies>
<dependency>
<groupId>group1</groupId>
<artifactId>group1-artifact</artifactId>
<version>1.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
第一组
第一组伪影
1.0.1
聚甲醛
进口
如果我将这些依赖项放在子POM中,它将非常有效。我使用jenkins在nexus中进行
clean install
安装和deploy
部署。我使用的是maven-3.3.9。在jenkins中,我阅读了git中两个不同maven项目中的父级和子级POM。我想从父POM继承所有依赖项和插件。可能吗 事实上,你有两种方法来解决这个问题
节点下的父pom中考虑依赖项,要么在需要依赖项的每个子pom中,在
节点中添加依赖项。您可以选择不设置依赖项的版本
节点的父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>
对于插件,其工作原理相同,但与
和
节点一起工作。所有配置都可以进入父pom对插件的定义中,您只需在子pom的
部分声明插件。您应该在
部分声明要继承的依赖项即可实现此目的
用于以后必须在特定子项的
中引用才能生效的定义
更新:声明每个子pom将继承的依赖项时要小心。很快,您就可以拥有不需要的依赖项,因为它们是在父级中声明的。正如其他评论者所提到的,
可能是一个更好的选择,尽管它不是您最初想要的。下面是如何使用父级和子级POM的示例
父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>
// 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>
.......
在父pom的dependencyManagement
标记中放置所有子项的公共依赖项是一个很好的做法。通过这种方式,您可以从一个位置管理这些依赖项的版本。parent 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>
4.0.0
org.springframework.boot
spring启动程序父级
2.0.4.1发布
com.ll
父模块
聚甲醛
1.0-快照
com.google.protobuf
protobuf java
3.11.0
org.apache.zookeeper
动物园管理员
3.5.7
子模块1
子模块2
子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>
4.0.0
com.ll
父模块
1.0-快照
com.ll
子模块1
1.0-快照
罐子
org.apache.zookeeper
动物园管理员
1.child将使用zookeeper:3.5.7,版本来自父pom.xml:。
2.child将使用protobuf java:3.11.o,它来自父pom.xml:。
在
中添加的任何内容都将自动添加到孩子的pom中。唯一需要注意的是,在child的pom中,我们不需要显式地添加版本,否则这将是仅对child模块可用的其他依赖项
parent_pom.xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
</dependencyManagement>
org.projectlombok
龙目
1.18.20
child_pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
org.projectlombok
龙目
您的意思是,在父pom中,我应该在标记中声明所有依赖项,而不是在子pom中?我已将所有依赖项放在父pom的标记中。这是一个问题吗?如果您的目标是继承所有子POM的特定依赖项,而不需要在每个子POM中清除它们-那么是的,您应该在
中声明它们,而不是
。另一方面,
中声明的依赖项只能在子pom中需要时使用-您只需将其组和工件写入该子pom中的
。好处是其他属性(版本)在父级中只声明一次。谢谢。是的,我的目标是将特定的依赖项继承给子POM。只是为了确保,根据您的回复,我将把这些特定的依赖项放在父pom中(而不是标记中),对吗?我如何通过子项目使用父项目的类?谢谢。但是如果不在节点的子pom中添加依赖项,不设置依赖项的版本,我就无法从父pom继承依赖项,对吗?我更新了我的答案,因为它不准确。事实证明,如果将依赖项添加到父pom的
节点中,则不需要在子pom中添加依赖项。这是您的选择。虽然您当然可以这样做,但将
放在
之外的父pom中很少是一个好主意。您的所有子模块将始终继承所有这些依赖项。任何其他可能使用您的模块之一的项目也会暂时获得所有这些DEP,并且可能发生冲突或更糟的情况,特别是如果这个子模块没有使用所有这些DEP。@ArthurNoseda的原始解决方案是最好的。我如何通过子p使用父项目的类呢
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>