maven中dependencyManagement与dependencies的区别与联系

简介: maven中dependencyManagement与dependencies的区别与联系

背景

新的需求中需要使用到easyexcel中的动态生成列的功能,但是因为我们项目一开始使用的是1.2.4-beta的低版本,并不支持此项特性,所以我们需要将easyexcel的版本升级到高版本,让手下去拉个将项目中的easyexcel的版本升级至2.2.6。

目前的这个项目中对应有10个子项目,一开始小伙改的时候,只是把对应的impl的版本给改了,这样就会导致项目在打包运行其他子项目时会出现classNotFound的错误,因为这些类还是向上找的老版本的easyexcel,所以打包报错。

小伙不了解maven中的dependencyManagement标签特性,就傻乎乎的将每个子项目中的dependencies中关于easyexcel的那一项显式地声明为高版本,这样的话非常的笨拙,而且不利于管理。

利用dependencyManagement标签特性我们只需要在父项目中声明dependencyManagement并制定easyexcel的版本号即可,子项目不需要再次声明了。

接下来重点记一下这两个标签的区别。

区别

1. dependencyManagement标签:只是声明项目对jar包的依赖关系并对所依赖jar包进行版本管理,并不实现引入。而dependencies标签则是将所依赖的jar直接加到项目中。

2. dependencies标签:因为dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

在pom.xml文件中对jar的版本的判断途径:

1)如果dependencies里的dependency自己没有声明version元素,那么maven就会到dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version。

2)如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。

<!-- 会实际下载jar包,子项目会继承这些依赖  -->  
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
        </dependency>
    </dependencies>
    <!-- //只是对版本进行管理,不会实际引入jar,子项目继承时必须显示声明  -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>2.2.6</version>
            </dependency>
        </dependencies>
    </dependencyManagement>


本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

目录
相关文章
|
7月前
|
Java Maven Spring
Maven高级-继承、实施步骤及聚合与继承的区别
Maven高级-继承、实施步骤及聚合与继承的区别
75 0
|
1月前
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
78 3
|
4月前
|
XML Java Maven
Java 中的 Maven 和 Ant 的区别
【8月更文挑战第22天】
201 0
|
6月前
|
Java 项目管理 Maven
Java一分钟之-Maven profiles与dependencyManagement
【6月更文挑战第5天】本文探讨了Maven的profiles和dependencyManagement特性在Java项目管理中的应用,包括基本概念和常见问题。Profiles用于根据不同环境激活配置,易错点在于忘记激活,应通过命令行或设置默认profile来避免。dependencyManagement集中管理依赖版本,过度依赖会导致子模块灵活性降低,应合理使用。结合两者,可在不同环境中控制依赖版本,提高项目配置效率。
161 8
|
Java 测试技术 Maven
maven跳过单元测试-maven.test.skip和skipTests的区别
maven跳过单元测试-maven.test.skip和skipTests的区别
|
7月前
|
Java Linux Apache
Maven的Binary与Source区别
Maven的Binary与Source区别
207 1
|
7月前
|
Java API Maven
maven中scope和optional区别
maven中scope和optional区别
101 1
|
测试技术
Maven-DskipTests和-Dmaven.test.skip=true的区别
Maven-DskipTests和-Dmaven.test.skip=true的区别
256 6
|
7月前
|
Java Maven Spring
StringUtils工具类的maven坐标以及StringUtils.isBlank()和StringUtils.isEmpty()的区别
StringUtils工具类的maven坐标以及StringUtils.isBlank()和StringUtils.isEmpty()的区别
156 0
|
Java Unix Linux
M2_HOME还是MAVEN_HOME配置环境变量,有什么区别?
M2_HOME还是MAVEN_HOME配置环境变量,有什么区别?
352 0