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文件
问题分析
当前线索梳理
- 项目都一样,只是一个同事遇到了。暂时排除代码跟pom.xml的问题
- 怀疑点本地 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 更新自己的项目配置文件。