Maven项目中依赖传递优先级问题的实践 & dependencyManagement标签的使用

7 篇文章 0 订阅
4 篇文章 0 订阅

Maven项目中依赖传递优先级问题的实践

突然说道maven的jar包依赖问题,原因是某个安全级别较高的客户现场扫描到了我们产品项目的jar包存在漏洞,需要升级jar包版本,我的实践由此展开

查看项目的完整依赖树

要升级jar包版本,首先要看到当前项目的jar包版本

执行mvn dependency:tree查看项目的完整依赖树

我是在IDEA中使用Maven管理工具 工具栏中的Execute Maven Goal,如下图所示:
在这里插入图片描述
点击打开,输入Maven命令,特殊说明:在windows的cmd中执行命令,需要在最前面加上mvn,而在这里不需要,如下图所示:
在这里插入图片描述
可以看到控制台输出的树形依赖结构,这里给出示例:

pilafs-MacBook-Pro:content-admin pilaf$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< com.**:content-admin >-------------------
[INFO] Building content-admin 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:3.1.1:tree (default-cli) @ content-admin ---
[INFO] com.demo:content-admin:jar:1.0-SNAPSHOT
[INFO] +- com.demo:content-api:jar:1.0-SNAPSHOT:compile
[INFO] +- com.demo:content-common:jar:1.0-SNAPSHOT:compile
[INFO] |  +- org.apache.httpcomponents:httpclient:jar:4.5.8:compile
[INFO] |  |  \- org.apache.httpcomponents:httpcore:jar:4.4.11:compile
[INFO] |  \- org.apache.httpcomponents:httpmime:jar:4.5.8:compile
[INFO] +- org.springframework.boot:spring-boot-starter-test:jar:2.1.4.RELEASE:test
[INFO] |  +- org.springframework.boot:spring-boot-test:jar:2.1.4.RELEASE:test
[INFO] |  +- org.springframework.boot:spring-boot-test-autoconfigure:jar:2.1.4.RELEASE:test
[INFO] |  +- com.jayway.jsonpath:json-path:jar:2.4.0:test
[INFO] |  |  \- net.minidev:json-smart:jar:2.3:test
[INFO] |  |     \- net.minidev:accessors-smart:jar:1.2:test
[INFO] |  |        \- org.ow2.asm:asm:jar:5.0.4:test
[INFO] |  +- org.assertj:assertj-core:jar:3.11.1:test
[INFO] |  +- org.mockito:mockito-core:jar:2.23.4:test
[INFO] |  |  +- net.bytebuddy:byte-buddy:jar:1.9.12:test
[INFO] |  |  +- net.bytebuddy:byte-buddy-agent:jar:1.9.12:test
[INFO] |  |  \- org.objenesis:objenesis:jar:2.6:test
[INFO] |  +- org.hamcrest:hamcrest-core:jar:1.3:compile
[INFO] |  +- org.hamcrest:hamcrest-library:jar:1.3:test
[INFO] |  +- org.skyscreamer:jsonassert:jar:1.5.0:test
[INFO] |  |  \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test
[INFO] |  +- org.springframework:spring-core:jar:5.1.6.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-jcl:jar:5.1.6.RELEASE:compile
[INFO] |  +- org.springframework:spring-test:jar:5.1.6.RELEASE:test
[INFO] |  \- org.xmlunit:xmlunit-core:jar:2.6.2:test
[INFO] +- com.h2database:h2:jar:1.4.199:runtime
[INFO] \- mysql:mysql-connector-java:jar:5.1.46:runtime
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.431 s
[INFO] Finished at: 2019-07-22T14:29:55+08:00
[INFO] ------------------------------------------------------------------------

然后使找到要升级版本的jar包都被谁引用了

org.springframework.boot:spring-boot-starter-web:jar

在这里插入图片描述
可以看到是springboot的jar引用了这个目标jar,而我们的项目又引用了springboot的jar包。

升级jar包版本

现在需要想办法把目标jar的版本升级到指定版本
在这里插入图片描述

于是现在直接在项目中指定引用jackson-databind的版本

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.10.3</version>
    </dependency>

重新build项目后,再查看jackson-databindjar包的依赖情况

查看某个jar包的依赖情况

查看依赖树中包含某个groupId和artifactId的依赖链(注意-Dincludes后面是等于号)
mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind:
在这里插入图片描述

dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind:

引用jar包依赖传递

之前的依赖情况如下图
在这里插入图片描述

直接引用jar包

现在的依赖情况如图所示:
在这里插入图片描述

到此问题解决

参考
maven项目查看依赖树
Idea查看Maven依赖树


dependencyManagement标签的使用

dependencyManagement使用简介

Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。

举例
在父项目的POM.xml中配置:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>1.2.3.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

此配置即生命了spring-boot的版本信息。

子项目则无需指定版本信息:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

使用优点
如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号。当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要逐个修改子项目;另外如果某个子项目需要另外的一个版本,只需要声明version即可。

注意事项
dependencyManagement中定义的只是依赖的声明,并不实现引入,因此子项目需要显式的声明需要用的依赖。

参考
dependencyManagement使用简介

Maven实战— dependencies与dependencyManagement的区别

Maven中依赖的优先级问题

Maven传递依赖的坑:父pom中dependencyManagement版本优先级高于传递依赖版本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

無间行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值