定位某个类是在哪个JAR的什么版本开始出现的

背景

我们在依赖第三方JAR时,同时也会间接的依赖第三方JAR引用的依赖,而当我们项目中某个依赖的版本与第三方JAR依赖的版本不一致时,可能会导致第三方JAR的在运行时无法找到某些方法或类,从而无法正常使用。

如我正在开发的一个sdk.jar,其中会使用OpenFeign来进行HTTP通信,现在的项目一般来说都是通过依赖 spring-cloud-openfeign-core,并标注 @FeignClient 注解来实现,但是此项目却不能依赖 spring-cloud-openfeign-core。原因是我们公司有大量的老项目,使用的Spring版本比较老如Spring4,或是有的项目并没有使用Spring Boot。所以在设计之初时,为了兼容老项目,并且尽可能轻量,就设计成了sdk.jar不去依赖Spring Boot以及Spring Cloud,所以只能使用更加底层的io.github.openfeign:feign-core通过Feign.Builder创建各FeignClient。

其中如果要让Feign识别SpringMVC的各种注解,需要为其指定Contract,使用 spring-cloud-openfeign-core 时可以指定 SpringMvcContract,而使用 io.github.openfeign:feign-core 则需要指定 SpringContract,该类是在 io.github.openfeign:feign-spring4 中定义的。

一切看似正常,直到有一个项目使用sdk后在发起HTTP请求时抛出异常

Caused by: java.lang.NoClassDefFoundError: feign/DeclarativeContract
	at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_202]
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[na:1.8.0_202]
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 

检查了下,该类是 SpringContract继承的父类。我们sdk.jar中openfeign版本是10.12,而对方项目中本身依赖了 spring-cloud-openfeign-core:2.1.2.RELEASE,对应io.github.openfeign:feign-core的版本为10.2.3,而该版本下确实没有DeclarativeContract类的。

知道问题的所在,那么就需要让对方升级openfeign的版本,并且在我们的用户手册兼容性章节下做出说明,那么到底是从什么版本开始有这个类的呢。如果按照合规性来说,每个新类或新方法的出现应该标注@since注解的,好告知使用者是从什么版本开始新增的,比如

/**
 * @author beemo
 * @since 1.2.0
 */
public class Test {
}

但是实际上标注的是少数,包括openfeign,所以并不能直接是从什么版本开始新增的。

这时候就需要通过查询网站进行查询了。

实践

search.maven.org

https://search.maven.org/icon-default.png?t=N7T8https://search.maven.org/该网站是官方搜索网站,可以根据坐标、根据类或者根据checksum进行搜索,搜索格式如下

如在文章中最开始的例子中,我想搜索 DeclarativeContract 是从哪个版本中出现的,就可以在搜索框中输入如下搜索条件

 

可以看到,搜索结果有516条,翻页后发现有其他的jar中也包含同样的类,所以我们还需要再过滤一下,根据搜索格式说明增加过滤条件:

这次搜索只搜出了34条,这下我们可以回答前文的问题了,那就是至少升级到10.5.0版本才可以正常使用。


central.sonatype.com

Maven CentralOfficial search by the maintainers of Maven Central Repository.icon-default.png?t=N7T8https://central.sonatype.com/此网站同样是官方的网站,并且界面更好看,搜索条件也更丰富,查询方式略有不同,如下所示

总结

借助上述的网站,我们可以既可以搜索某个类是在什么版本出现的,也可以当程序执行报ClassNotFound等异常时,搜索缺失的依赖是什么,还是比较方便的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/244392.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为配置策略路由(基于IP地址)示例

组网需求 如图1所示,汇聚层Switch做三层转发设备,接入层设备LSW做用户网关,接入层LSW和汇聚层Switch之间路由可达。汇聚层Switch通过两条链路连接到两个核心路由器上,一条是高速链路,网关为10.1.20.1/24;另…

YOLOv8使用SAHI切片辅助推理:《SAHI切片辅助推理解析》推理教程(附推理源代码)

💡该教程为改进RT-DETR指南,属于《芒果书》📚系列,包含大量的原创改进方式🚀 💡🚀🚀🚀内含改进源代码 按步骤操作运行改进后的代码即可💡更方便的统计更多实验数据,方便写作 YOLOv8使用SAHI切片辅助推理:《SAHI切片辅助推理解析》推理教程(附推理源代码…

家委会的职责

家委会,起着至关重要的作用。然而,而很多人对家委会的职责并不清楚。 家委会是家长与学校之间的沟通桥梁。家委会成员需要积极与学校沟通,了解学校的各项政策和规定,并及时向家长传达。同时,家委会也需要收集家长的意见…

构建外卖小程序:技术实践与代码示例

外卖小程序的开发涉及前后端的多个技术领域,从用户界面设计到数据库管理,都需要巧妙的技术方案。在本文中,我们将以微信小程序平台为例,通过简单的代码示例,介绍如何搭建一个基本的外卖小程序。 1. 准备工作 首先&a…

量子计算挑战赛启动!空中客车公司和宝马集团联手发起

(图片来源:网络) 空中客车公司(Airbus)和宝马集团(BMW)共同发起了一项名为“探索量子迁移率”的全球量子计算挑战赛,旨在解决航空和汽车领域仍未克服的紧迫难题。 此次挑战赛汇聚了…

微信小程序uniapp记住密码

记住密码功能 在请求登录接口成功后,我们需要判断用户是否勾选记住密码,如果是,则将记住密码状态、账号信息存入本地。 下次登录时,获取本地的记住密码状态,如果为true则获取本地存储的账号信息,将信息回填…

Google为什么它还没有开发出ChatGPT,如何反超,小公司创新的产品如何反超巨头 行业巨头如何防止被小公司或创新型公司的产品超越

Google虽然收购了Geoffrey Hinton及其在多伦多大学的两名研究生组成的公司DNNresearch Inc.,但为什么它还没有开发出类似ChatGPT的产品,可能有以下几个原因: 不同的研发方向:Google在人工智能领域的研发方向可能与OpenAI&#xff…

【Linux】fork()函数详解

什么是fork? fork()函数通过系统调用并创建 一个与原来进程几乎完全相同的进程 此进程叫做子进程,两个进程做一样的事 但初始参数或者传入的变量不同,两个 进程便可以做不同的事 fork的返回值 在父进程中&#xff0…

iptables基础 iptables-save iptables-persistent持久化

介绍 iptables由上而下,由Tables,Chains,Rules组成。 一、iptables的表tables与链chains iptables有Filter, NAT, Mangle, Raw四种内建表: 1. Filter表 Filter是iptables的默认表,它有以下三种内建链(chains)&…

Kafka基础理论与常用命令详解(超详细)

文章目录 前言一、Kafka概述1. Kafka简介2. Kafka架构2.1 Broker(代理服务器)2.2 Topic(主题)2.3 Producer(生产者)2.4 Consumer(消费者)2.5 Consumer Group(消费者组&am…

synchronized加锁对象是什么、synchronized底层原理

一、synchronized加锁对象是什么 为了方便参考,以下是调用加了synchronized方法的代码: public class Test02_Synchronized {public static void main(String[] args) {init();}public static void init() {OutPut outPut new OutPut();new Thread(()…

Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯

目录 IMX6ULL 的 GPIO 操作方法 GPIO 操作相关名词 IMX6ULL 的 GPIO 模块结构 GPIO 模块内部 读 GPIO​编辑 写 GPIO​编辑 LED 点灯驱动程序 字符设备驱动程序框架 编写驱动程序的步骤: 先编写驱动程序代码: 再编写测试程序代码:…

PFA洗瓶一体成型PFA尖嘴洗涤瓶可储存强腐蚀溶剂

在化学实验室中用于装清洗溶液的一种容器,并配有发射细液流的装置的洗瓶,常常被称为喷洗瓶或喷雾洗瓶。这种洗瓶通常具有细长的喷嘴,能够产生细小的喷雾或细液流,用于对特定区域或实验器皿进行有针对性的清洗。喷洗瓶广泛应用于化…

C语言--有一个3*4的矩阵,求出其中最大值的那个元素的值,以及其所在的行号和列号

一.题目描述 有一个3*4的矩阵,要求求出其中最大值的那个元素的值,以及其所在的行号和列号 比如:给定一个3*4的矩阵如下 输出结果:最大值为 12 ,行号为3, 列号为2 二.思路分析 打擂台算法: 先思考…

XCP详解「3.6·DaVinci中XCP配置」

总目录全展开 XcpCmdConfig中具体配置 XcpConfig中配置 XcpGeneral中配置

【Linux进阶之路】信号

文章目录 一 、初始信号1.概念2. 简单认识3. 硬件信号 二 、异常与信号1.信号处理异常2.特殊事件3.终端信号与内核信号 三、深入信号1.信号的发送2.信号的保存2.1.sigset_t2.2.sigprocmask 3.信号的处理 四、内核1.原理2.函数 尾序 一 、初始信号 1.概念 信号我们可以大体上从…

学习黑马vue

项目分析 项目下载地址:vue-admin-template-master: 学习黑马vue 项目下载后没有环境可参考我的篇文章,算是比较详细:vue安装与配置-CSDN博客 安装这两个插件可格式化代码,vscode这个软件是免费的,官网:…

Java反射,枚举讲解

💕"理想者最可能疯狂。"💕 作者:Mylvzi 文章主要内容:Java反射,枚举讲解 "💕 作者:Mylvzi 文章主要内容:数据结构之Map/Set讲解硬核源码剖析 一.反射 1.概念 …

命令执行RCE及其绕过详细总结(17000+字数!)

目录 操作系统连接符&#xff1a; 常见函数&#xff1a; 绕过过滤&#xff1a; 空格过滤绕过&#xff1a; 1、大括号{}&#xff1a; 2、$IFS代替空格&#xff1a; 3、重定向字符<&#xff0c;<> 4、%09绕过&#xff08;相当于Tab键&#xff09; 文件名过滤绕过…

PyCharm连接远程服务器上Docker容器,使用远程服务器的python intercepter解释器和GPU资源 [本地调试深度学习代码]

概述 在编写常规深度学习代码时&#xff0c;总是需要使用服务器上的GPU资源&#xff0c;所以一般要写完代码&#xff0c;放到服务器&#xff0c;然后使用GPU运行。但是由于之前的习惯&#xff0c;总想本地调试一下或者本地直接跑测试结果&#xff0c;再放到服务器去跑。 网上…