记一次Maven依赖解析的错误

1,410 阅读2分钟

这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

问题描述

今天,在编写一个rest客户端的代码的时候,需要导入一个http依赖的时候,如下:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcomponents-client</artifactId>
    <version>4.5.13</version>
    // 以下这个类型这段代码在我引入的时候被我删除了
    <type>pom</type>
</dependency>

很奇怪的问题发生了,这个引用依赖竟然无法解析,报错信息如下:

Cannot resolve org.apache.httpcomponents:httpcomponents-client:4.5.13 

Clean up the broken artifacts data and reload the project.

但是在此之前,我的Maven的配置以及仓库都运行的很好啊,没有任何的问题。为什么现在就发生问题呢,让我非常的不理解。

排查过程

引入另一个依赖

因为这个依赖无法引入,这个还不能就断定我的Maven配置的问题,于是我找到了一个新的一个依赖,Elasticsearch的:

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>8.0.0</version>
</dependency>

这时候Elasticsearch的依赖可以正常的解析并且导入。这个就可以判断出我的Maven的配置是没有问题的,可以正常的引入和下载jar包。

本地导入

既然Maven无法解析到对应的依赖,那么我可以去寻找jar包,从本地去导入的,于是我去网上的在线远程仓库里寻找httpcomponents-client的依赖的jar包,发现了一个很奇怪的问题,这个依赖竟然没有jar包可以下载,只有pom这个选项,其他的是有jar包的选项的,我还特定找了它以前的版本,也没有找到jar包的选项。

无jar包选项 image.png

有jar包选项的依赖: image.png

最终解决办法

因为类型定义为pom的依赖,是一个依赖的合集,并不是一个真正的依赖,我们需要把这种依赖定义在<dependencyManagement>中,然后在正常依赖中引用里面定义的依赖,不用添加版本号就可以了,如下图

image.png

总结

这次依赖解析的问题花费了很多时间在排查无关的问题上,比如IDEA的缓存,重建索引。核心的问题定位不准,导致浪费了一些时间。

参考文献

Dependency_Management