2020-09-27 IDEA Maven dependencyManagement中的依赖版本会覆盖传递依赖版本

IDEA Maven dependencyManagement中的依赖版本会覆盖传递依赖版本

参考帖子

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

问题描述

同一个项目,同事拉取其他同事更新内容(含有 poi 的版本升级),她的 IDEA无法找到 poi 4.1.2的版本,只能找到之前更新poi前的 3.17 和 3.9 版本。
我本地拉取同一个更新分支,没有遇到问题。

顶级 pom

使用的 springcloud 微服务框架项目,顶级 pom.xml 引用了 io.spring.platform。io.spring.platform里面设置了dependencyManagement,指定 poi 版本是3.17

    </dependencyManagement>
    <!-- 其他依赖略 -->
            <dependency>
                <groupId>io.spring.platform</groupId>
                <artifactId>platform-bom</artifactId>
                <version>${spring.platform.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

父级 pom.xml 中的dependencies 与 dependencyManagement 的区别
父级 pom.xml 中的 dependencies
会对于引入该 pom.xml 的子模块引入父级声明的dependencies的依赖包。
父级 pom.xml 中的 dependencyManagement
只是声明依赖,子项目并不引入依赖。
子项目默认不会导入父项目 dependencyManagement 中的依赖
只有在子项目中写了父级同一个依赖项(子项目声明了具体的一个dependency的groupId,artifactId跟父级里的dependencyManagement的groupId,artifactId一致时),没有设置的dependency属性值version、exclusions、scope等,会从父项目中继承里面的配置。
子项目如果想使用跟父级 pom.xml 中 dependencyManagement 不一样的配置属性值(dependency属性值version、exclusions、scope等),可以自己配置下,其余的不配置的都会跟父级 pom.xml一样。

所以也可以看出来 dependencyManagement 只是预设置了一些子项目可能要用到的依赖的 dependency 的各种配置属性。子项目如果没用这些依赖包(没有配置dependency的groupId,artifactId就不会去导入),这样减少子项目的非必要包的导入。如果用到,没有特殊需求可以简化子项目的 dependency 配置(只需要配置groupId和artifactId即可),方便通过父级 pom.xml 传递配置属性, 统一控制子级可能会用到的依赖配置属性。

子级项目 pom

<dependencies>
<!-- 其他依赖略 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
</dependencies>

在idea中可以看到上级pom.xml dependencyManagement 对 poi 的版本进行了设置,鼠标指向左侧图标可以看到提示信息,或者点击图标跳到上级的pom文件
在这里插入图片描述

问题分析

当前线索梳理

  1. 项目都一样,只是一个同事遇到了。暂时排除代码跟pom.xml的问题
  2. 怀疑点本地 maven 或者 idea 问题

尝试收集线索跟解决

更新 maven 版本(无果)

同事先更新了本地 maven 从3.3.9 到最新的 3.6.3,并配置给了IDEA 。没有效果。为了避免IDEA配置的maven 跟系统环境的不一致,后来顺带修改了下windows 环境变量更新了系统环境的 maven 到 3.6.3。

观察出问题的 IDEA 里的项目

发现有诡异的地方。
在IDEA maven 窗口处,问题模块的 poi 版本可以看到是有4.1.2版本,没有3.17版本。 没有问题。但是项目里的 java 代码还是无法找到 4.1.2 只能找到 3.17。
然后偶然间去项目窗口看到下面的依赖情况。能看到3.9和3.17但是没有4.1.2
在这里插入图片描述
跟 maven窗口看到的不一致。
开始怀疑IDEA缓存问题。就打算点击 File->Invalidate Caches /Restart…
在这里插入图片描述
弹出框里选择了 Invalidate and Restart
在这里插入图片描述
等待 IDEA 重启后依然没有效果。。。。

解决方法

最后定位到了项目的idea配置文件.查看项目根目录下的 .idea/libraries文件夹发现跟错误的项目的依赖jar情况一样,缺少4.1.2的poi。然后删除了项目里的整个.idea文件夹。重启idea,等待idea自己重新创建.idea文件夹。发现问题解决了。。。。。。
虽然问题解决了但是仍然没有弄清产生这个问题的根本原因。线上来说只是idea的自己项目配置文件记录的jar的情况跟maven不一致。maven折腾半天也没有触发 idea 更新自己的项目配置文件。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值