Maven 如何将依赖项从父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

我在使用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>
.......
<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中声明依赖项,每个子节点都将受益于该依赖项
  • 例如,如果您在父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>