maven---parent和dependencyManagement标签

曾苗宣
2023-12-01

前沿

之前对maven的学习不系统,只是知道简单的使用方法,工作之后才对maven有了更深的学习。接下来小白会利用空闲时间,系统的学习一下maven,并且记录一下maven的学习心得,和大家分享一下。由于本人能力有限,写的博客难免会出现问题。希望大家也希望各位大佬指出问题,共同进步。

这里记录的maven使用时的parent和dependencyManagement标签的作用和dependencyManagement于dependency标签的区别。

这里通过两个场景进行说明:

场景一,有两个web项目W1、W2,一个java项目J1,依赖同一个jar包:domain.jar。如果分别在各自pom文件中引入domain.jar的依赖,那么当domain.jar的版本发生变化时,三个项目的pom文件都要改,项目中依赖越多修改越多。

此时就可以使用parent标签, 可以创建一个parent项目,打包类型为pom,parent项目中没有任何代码,只是管理多个项目之间公共的依赖。在parent项目的pom文件中定义对domain.jar的依赖,W1W2J1三个子项目中只需要定义<parent></parent>,parent标签中写上parent项目的pom坐标就可以引用到domain.jar了。

场景二,有一个springweb.jar,只有W1W2两个web项目需要,J1项目是java项目不需要,那么又要怎么去依赖?

可以在W1和W2中分别定义对springweb.jar的依赖,当springweb.jar版本变化时修改起来不方便。

解决办法是在parent项目的pom文件中使用<dependencyManagement>即公共的依赖写在parent的<dependency>中,不是全部需要的依赖写在dependencyManagement中,当版本修改之后只需要修改parent的dependencyManagement中的版本就可以了,子项目只需要引用就好了。(前提是子项目不写版本号,否则以子项目的版本为主)

1、parent标签

parent标签能够管理多个项目之间公共的依赖。通过字面意思我们很容易想到java中的继承,他和 java 中的继承相当,作用就是复用。例如场景一的例子。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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>
    <artifactId>xxxxxx</artifactId>
    <packaging>pom</packaging>
    <version>1.0.1-SNAPSHOT</version>
    <description>xxxxxxx</description>

    <parent>
        <groupId>xxxxxp</groupId>
        <artifactId>ip-pomxxxx-parent</artifactId>
        <version>2.0.6-RELEASE</version>
    </parent>

    <name>y-core-parent</name>
    <modules>
        <module>e-contract-common</module>
      
    </modules>

    <properties>
        <contract.pub.version>1.0.2-SNAPSHOT</contract.pub.version>
    </properties>
......

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.x x x.iuap</groupId>
                <artifactId>x x x</artifactId>
                <version>${cont.pub.version}</version>
            </dependency>
<-- <properties>
        <contract.pub.version>1.0.2-SNAPSHOT</contract.pub.version>
    </properties>-->
           
    </dependencyManagement>

    <!--私服配置,用于发布-->
    <distributionManagement>
        <repository>
            <id>ddds</id>
            <name>Nexus Release Repository</name>
            <url>http:maven仓库地址</url>
        </repository>
       
    </distributionManagement>

</project>

这个是项目的配置文件

 <parent>
        <groupId>xxxxxp</groupId>
        <artifactId>iuap-pomxxxx-parent</artifactId>
        <version>2.0.6-RC1-RELEASE</version>
    </parent>

实现对依赖的版本统一控制,点进去我们会进入到该pom中,我们会发现该pom根据ucf-parent管理

     <parent>
        <groupId>com.xx.iuap</groupId>
        <artifactId>ucf-parent</artifactId>
        <version>2.0.1-RELEASE</version>
    </parent>

再点进去会发现

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.11.RELEASE</version>
    </parent>

    <groupId>com.xx.iuap</groupId>
    <artifactId>uc-parent</artifactId>
    <version>2.0.1-RELEASE</version>
    <name>uc-parent</name>
    <packaging>pom</packaging>

 即,会继承springboot的依赖包,整个依赖关系如下

- 注释: 目前 父->子的依赖关系为

org.springframework.boot: spring-boot-starter-parent

-> com.xx.iuap: iuap-3rd-party(公司外开源的)

-> com.xx.iuap: iuap-2nd-party(公司内部的依赖库)

-> com.yonyou.iuap: yonyou-mdd-starter-parent  一方包(工程中各个模块之间的依赖)

二方包的管理

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

    <groupId>com.xx.iuap</groupId>
    <artifactId>iuap-pom-with-ucf-parent</artifactId>
    <version>2.0.6-RC1-RELEASE</version>

    <name>iuap-pom-with-ucf-parent</name>
    <packaging>pom</packaging>

    <properties>
        <!-- ucf组件 -->
        <uc.version>2.0.0-RELEASE</ucf.version>
        <uc.file.version>2.0.0-RELEASE</ucf.file.version>
        <uc.log.version>1.0.9-RELEASE</ucf.log.version>
        <uc.ds.version>2.0.0-RELEASE</ucf.ds.version>
        <!--  iuap组件  -->
        <ap.version>5.0.4-RELEASE</iuap.version>
        <irs.version>5.2.8-RELEASE</iris.version>
        <mwclient.version>5.2.8-RELEASE</mwclient.version>
        <eos-spring-support.version>5.2.8-RELEASE</eos-spring-support.version>
        <auth.sdk.version>6.0.2-RELEASE</auth.sdk.version>
        <auth.sdk.core.version>3.5.2-RELEASE</auth.sdk.core.version>
        <open.isv.version>1.0.0-RELEASE</open.isv.version>
       
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.xx.iuap</groupId>
                <artifactId>iuap-pom</artifactId>
                <version>2.0.6-RC1-RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <distributionManagement>
        <repository>
            <id>iUAP</id>
            <name>iUAP</name>
            <url>http://maven.yonyou.com/nexus/content/repositories/iUAP/</url>
        </repository>
    </distributionManagement>
</project>

三方包的管理

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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.2.11.RELEASE</version>
    </parent>
    <groupId>com.yonyou.iuap</groupId>
    <artifactId>ucf-parent</artifactId>
    <version>2.0.1-RELEASE</version>
    <name>ucf-parent</name>
    <packaging>pom</packaging>

    <properties>
        <HikariCP.version>3.3.1</HikariCP.version>
        <activation.version>1.1.1</activation.version>
        <activiti.version>5.22.0</activiti.version>
        <activemq-spring.version>5.16.0</activemq-spring.version>
        <alipay-sdk.version>4.10.70.ALL</alipay-sdk.version>
        <amqp-client.version>5.4.3</amqp-client.version>
        <antisamy.version>1.5.7</antisamy.version>
        <apache-lucene.version>3.0.1</apache-lucene.version>
        <junit-repeat-rule.version>3.0.1</junit-repeat-rule.version>
     
       ......
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>${cglib.version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-access</artifactId>
                <version>${logback.version}</version>
            </dependency>
           
            <dependency>
                <groupId>com.github.cbismuth</groupId>
                <artifactId>junit-repeat-rule</artifactId>
                <version>${junit-repeat-rule.version}</version>
            </dependency>
            
           
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-analyzers-common</artifactId>
                <version>${apache-lucene.version}</version>
            </dependency>
            
           ......

        </dependencies>
    </dependencyManagement>

    <!-- 插件管理配置 -->
    <build>
        <plugins>
            <!-- 定义JDK版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <distributionManagement>
        <repository>
            <id>iUAP</id>
            <name>iUAP</name>
            <url>http://maven.xxx.com/nexus/content/repositories/iUAP/</url>
        </repository>
    </distributionManagement>
</project>

2、dependencyManagement

使用dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,不用每个模块项目都弄一个版本号,不利于管理,当需要变更版本号的时候只需要在父类容器里更新,不需要任何一个子项目的修改;

如果某个子项目需要另外一个特殊的版本号时,只需要在自己的模块dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。如果不声明版本号的话,会使用父类的版本号。

3、dependencyManagement与dependencies区别:

(1)Dependencies相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
(2)dependencyManagement里只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖。

        1)如果不在子项目中声明依赖,是不会从父项目中继承下来的;

        2)只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并。                且version和scope都读取自父pom;

        3)另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

具体的使用区别可以查看之前的场景2

 类似资料: