httpclient与httpcore版本不匹配导致的编译问题

如题所述

第1个回答  2022-07-21

一、起因
maven编译报错

看本地的确不存在ThreadSafe这个文件,为什么会出现这个情况呢,升级之前还不存在这个问题,怀疑是jar包版本冲突导致的。
Google了下发现ThreadSafe是httpcore 4.4.4中的一个注解文件,将pom中httpcore的版本修改为4.4.4之后错误消失。

问题消失了不代表事情就可以结束了,原因是什么,为什么会出现这个问题? 做技术要有打破砂锅问到底的精神。

看项目中有很多文件有用到ThreadSafe这个注解,主要是有两个jar包,一个是 httpclient , 一个是它自己所在的包 httpcore 。查看httpclient的 pom.xml ,写的也比较明确,httpclient会依赖于httpcore包.

groupId , artifactId 比较容易理解,用于确定jar包的坐标, <scope> 表示范围, <version> 在哪儿呢?

查看httpclient在 META-INF/DEPENDENCIES 中写明了 Apache HttpCore org.apache.httpcomponents:httpcore:jar:4.4.4 。需要依赖于4.4.4的版本。我怀疑DEPENDENCIES文件只是起到一个说明作用,并不会做什么动作。应该是这样的,本身我的项目是spring-boot的,spring boot支持对jar包的版本进行统一管理,这个不在本章展开。

二、关于 scope
我们在httpclient中看到了dependency的依赖范围是 compile ,这个 scope 还有哪些枚举值呢? 都代表什么意思? scope 有6个枚举值, 分别如下

参考:

三、dependencies和dependencyManagement
要理解 dependencyManagement 需要知道它出现的背景,在一个多模块的工程中,各模块可能会依赖相同的jar包,之前是在每个模块的 pom.xml 中通过具体jar包的坐标来指定,但可能会造成不同版本之间jar包冲突导致的运行问题。
解决这个问题的方法就是在项目顶层 pom.xml 文件中使用 dependencyManagement 来 声明 那些 可能用到 的jar包以及其版本。子模块通过 <parent> 标签来指定依赖顶层项目的 pom 。子模块在写具体的 dependencies 的时候,就可以不指定jar包的版本,默认会使用 <parent> 中的 dependencyManagement 中的版本,从而达到在一个项目中依赖的第三方jar包版本统一的目的。