今天碰到群里小伙伴问,线上程序好像有多个不同版本的Netty包,怎么去看到底加载了哪一个?

在说如何看之前,先来说说,当你开始意识到项目里有多个不同版本的Jar包,都是因为遇到了这几个异常:

  • 1、java.lang.NoSuchMethodException:自己代码中调用了某个方法,因为加载了其他版本的jar,这个版本正好没这个方法。

  • 2、java.lang.NoClassDefFoundError:编译时候是好的,但是运行的时候,因为加载的jar版本问题,没有这个类。

  • 3、java.lang.ClassNotFoundException:在动态加载某个Class的时候,因为要加载的jar不是正确的版本,而导致找不到这个类。

当你在本地运行ok,但到服务器上发现出现这些错误的时候,就要意识到很可能是jar冲突了(有相同依赖存在多个版本)。这个问题往往也会有这样的表现:多实例部署的时候,有的实例是好的,有的实例则不行。

查看加载的类和方法

根据之前分析的异常种类,我们可以去运行中的现场确认当前加载的问题。

这里我们可以使用阿里开源的Arthas工具,如果第一次用,那么按下面操作先安装再运行:

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

运行好之后,会打印出当前运行着的java应用,比如:

[INFO] arthas-boot version: 3.4.6
[INFO] Process 40611 already using port 3658
[INFO] Process 40611 already using port 8563
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 40611 chapter4-3-0.0.1-SNAPSHOT.jar[2]: 37786

通过输入编号选择要查看的java应用,比如这里选择:1,进入到chapter4-3-0.0.1-SNAPSHOT.jar中去。

下面介绍两个重要命令:

第一个:sc命令,我们确认一下可能冲突的jar包下面,是否有对应的class。有些不同版本包下class就不一样,马上就可以分辨出来。

比如,通过下面的命令,我们查看一下com.didispace包下有什么类:

[arthas@40611]$ sc com.didispace.*
com.didispace.chapter43.Chapter43Application
com.didispace.chapter43.Chapter43Application$$EnhancerBySpringCGLIB$$8b82b194
com.didispace.chapter43.UploadController
Affect(row-cnt:3) cost in 6 ms.

第二个:sm命令,查看具体某个类有哪些方法。有的版本差异就是去掉了某个方法,这个时候我们就可以通过这个命令来查看。

比如,通过下面的命令,我们查看一下com.didispace.chapter43.UploadController类下有些什么方法:

[arthas@40611]$ sm com.didispace.chapter43.UploadController
com.didispace.chapter43.UploadController <init>()V
com.didispace.chapter43.UploadController create(Lorg/springframework/web/multipart/MultipartFile;)Ljava/lang/String;
com.didispace.chapter43.UploadController uploadPage()Ljava/lang/String;
Affect(row-cnt:3) cost in 5 ms.

找到冲突并解决冲突

在确认完是加载错误的情况下,我们要去解决冲突。那么解决冲突要做的就是找到到底哪里冲突了以及我们要去除或者强制

找出版本冲突的方法:使用Maven命令:mvn -U dependency:tree -Dverbose。

命令执行之后,会在控制台以树状形式列出所有依赖内容,然后通过搜索的方式查找冲突的包,看看都是从哪个依赖中带进来的(在IDEA中搜索会高亮,更容易找到)。

[INFO] com.didispace:chapter4-3:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.4.1:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:2.4.1:compile
[INFO] |  |  +- org.springframework.boot:spring-boot:jar:2.4.1:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:2.4.1:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.4.1:compile
[INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.2.3:compile
[INFO] |  |  |  |  \- ch.qos.logback:logback-core:jar:1.2.3:compile
[INFO] |  |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.13.3:compile
[INFO] |  |  |  |  \- org.apache.logging.log4j:log4j-api:jar:2.13.3:compile
[INFO] |  |  |  \- org.slf4j:jul-to-slf4j:jar:1.7.30:compile
[INFO] |  |  +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
[INFO] |  |  \- org.yaml:snakeyaml:jar:1.27:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-json:jar:2.4.1:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.11.3:compile
[INFO] |  |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.11.3:compile
[INFO] |  |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.11.3:compile
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.11.3:compile
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.11.3:compile
[INFO] |  |  \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.11.3:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.4.1:compile
[INFO] |  |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.41:compile
[INFO] |  |  +- org.glassfish:jakarta.el:jar:3.0.3:compile
[INFO] |  |  \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.41:compile
[INFO] |  +- org.springframework:spring-web:jar:5.3.2:compile
[INFO] |  |  \- org.springframework:spring-beans:jar:5.3.2:compile
[INFO] |  \- org.springframework:spring-webmvc:jar:5.3.2:compile
[INFO] |     +- org.springframework:spring-aop:jar:5.3.2:compile
[INFO] |     +- org.springframework:spring-context:jar:5.3.2:compile
[INFO] |     \- org.springframework:spring-expression:jar:5.3.2:compile
[INFO] +- org.springframework.boot:spring-boot-starter-thymeleaf:jar:2.4.1:compile
[INFO] |  +- org.thymeleaf:thymeleaf-spring5:jar:3.0.11.RELEASE:compile
[INFO] |  |  +- org.thymeleaf:thymeleaf:jar:3.0.11.RELEASE:compile
[INFO] |  |  |  +- org.attoparser:attoparser:jar:2.0.5.RELEASE:compile

解决版本冲突的方式主要两种:

  • 1、通过上面的命令找到不需要的版本之后,在引入的依赖中,使用exclusions将其排除,比如下面这样:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><exclusions><exclusion><groupId>xxx</groupId><artifactId>yyy</artifactId></exclusion></exclusions></dependency>
  • 2、在pom.xml中强制指定要使用的版本,这样这个优先级最高,就不会引入其他版本要带进来的版本了。

好了,今天的分享到这里结束了,希望对你有所帮助。如果您觉得本文有用,欢迎转发扩散!

往期推荐

历史上的 996

新同事上来就把项目性能优化了一遍,瑟瑟发抖。。。

Java微服务 vs Go微服务,究竟谁更强!?

天才安全大佬即将拿股票前被拼多多辞退,原因是不愿意做黑客攻击?

当音乐学博士搞起编程,用一本书改变了Java世界!

Spring Boot 2.x基础教程:使用Flyway管理数据库版本

JAR冲突问题的解决以及运行状态下如何查看加载的类相关推荐

  1. zzw原创_cmd下带jar包运行提示 “错误: 找不到或无法加载主类 ”

    在windows下编译java,由于是临时测试一下文件,不想改classpath,就在命令行中用 -cp 或classpath引入jar包,用javac编译成功,便使用java带-cp 或classp ...

  2. gradle打成jar包报错 错误: 找不到或无法加载主类 App(已经配置过主类)

    文章目录 将gradle打成jar包(包括依赖) 运行jar包 报错 原因(src自己手动创建的) 解决(添加src目录) 将gradle打成jar包(包括依赖) jar {manifest {att ...

  3. 解决找不到或无法加载主类的问题

    今天重新配置了下环境,但是在用cmd运行字节码文件的时候,显示找不到或无法加载主类 .因为环境配置我看了下没有问题,可以运行.也没有网上说的跟包有关系(因为我根本就没有写包). 最后,经过一番查找,终 ...

  4. 创建maven项目生成WebRoot目录,web.xml文件,以及修改编译路径classess的解决办法,以及解决找不到或无法加载主类的问题。

    创建maven工程:首先File-->New-->Maven Project到下边界面: 点击Next到以下界面: 点击Next进入以下界面: 输入Group Id.Artiface Id ...

  5. idea 找不到或无法加载主类_解决IDEA中Groovy项目no Groovy library is defined的问题

    实验环境 IDEA2019.1.2 Groovy-2.5.8 错误重现 新建了一个Groovy工程,指定了groovy版本,如图 新建了一个简单的Groovy Class,运行,出现如下错误 错误的尝 ...

  6. C#.NET验证码智能识别学习笔记---06 解决java jre问题:JTessBoxEditor.jar打开的时报找不到或无法加载主类 com.sun.tools.javac.Main错误

    技术qq交流群:JavaDream:251572072  教程下载,在线交流:it.yunsit.cn 碰到了这个问题在网上搜了下, 问题描述:我的问题是在使用javac编译测试程序市,出现如下错误: ...

  7. ExtJs TreePanel使用TreeLoader在IE下无法正常加载显示的解决方法

    小菜使用如下代码生成TreePanel,代码与ExtJs自带的examples类似,在Firefox下运行正常,不过在IE下无法正常显示. Code <script language=" ...

  8. 解决连接oracle报错 尝试加载Oracle客户端库时引发BadImageFomatException。如果在安装64位Oracle客户端组件的情况下以32位模式运行,将出现此问题的报错。

    解决连接oracle报错 尝试加载Oracle客户端库时引发BadImageFomatException.如果在安装64位Oracle客户端组件的情况下以32位模式运行,将出现此问题的报错. 参考文章 ...

  9. mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法...

    发现问题 切换到mac平台后,突然想写点程序运行在mac下,想到mac自带java,会方便好多.不过在这过程中遇到了麻烦: 总是提示 "错误: 找不到或无法加载主类" 工程结构 查 ...

最新文章

  1. JPA的Column注解总结
  2. 第01课:深度学习概述
  3. CompletableFuture线程串行化方法
  4. client中周期性边界_「微评」增加艺术品在投资组合中的比例 推进国家艺术软实力...
  5. python3.6 django部署_Apache2+Django+Python3.6部署-
  6. imp库,python进入import内部
  7. 找出数组中只出现1次的两个元素
  8. 我有一个朋友毕业后一直在腾讯
  9. python中的多进程与多线程(一)
  10. 一款好用的绘制组织结构图的软件-亿图组织结构图
  11. 服务器sas硬盘转sata硬盘6,SAS接口(sas硬盘改sata家用)
  12. SPSS新手教程——对问卷数据进行处理之样本分布
  13. 如何提高研发部门工作效率的探讨
  14. c#上位机plc通讯读位
  15. R语言学习(六)——关联规则分析
  16. 2022面试经验分享(非技术)
  17. Java开源 开源工作流
  18. fiddler对浏览器、app抓包及证书安装
  19. 编写代码实现对多边形图案填充
  20. BATT集体发力搜索,争夺下一代搜索平台的“引路人”

热门文章

  1. docker 查看容器占用磁盘大小
  2. linux 开机启动 自启动 设置
  3. Liferay Portal Json Web Service 反序列化漏洞(CVE-2020-7961)
  4. java 反序列化 ysoserial exploit/JRMPListener 原理剖析
  5. linux 终端界面显示 中文乱码或方块
  6. Android 中设置只是程序第一次运行才显示的界面
  7. linux下查看和添加PATH环境变量
  8. HTML做3D立体特效,html5 3D立体粒子波浪动画特效代码
  9. 查看显卡显存_显卡显存越大性能就越好吗【详细介绍】
  10. Linux C编程--string h函数解析