网站首页 > 基础教程 正文
背景
某天,业务线的一个妹子过来找我,说升级到 framework-bom 1.9.3,发布时,应用启动不了,但本地启动是ok的。报错信息如下:
起因
我们中间件团队也对各种 starter 做了二次封装。比如 健康检测模块。
但是,在上图中,箭头指向的 package 跟 SpringBoot 框架是一致的。而Spring 框架里面没有 getMaxThreads 方法。
讨论
- 有人建议业务的妹子,把两者的 jar 的 MAVEN 坐标在 POM 文件中调换一下。我当时想着,这项目都部署完毕了,已经没有 maven 事情了,肯定是类加载机制的问题。
- 我当时请教一下别人,别人说,可能是 SpringBoot 框架记住了jar 的顺序了。咦,纳闷了,SpringBoot 还能干这个事情?如果不使用SpringBoot的话,肯定也有类似的加载的问题,肯定是不是框架层次的问题了。
初步结论
- 类加载冲突,导致出现问题。删除中间件团队封装的类即可。但是,冲突的原则或者策略是啥?让我们继续往下看!
Maven 的依赖规则
- 短路优先(就近原则)
- 先声明先优先使用。
如何排除某些jar 呢?
- idea 安装 maven healper 插件。如何使用,在这里就写了。
- maven help 命令来查看。
如何查看 java 应用加载 jar 的顺序呢?
- 查看 idea 启动的时候,查看加载 jar 的顺序(这个跟类加载是两回事哈)
- 部署应用的机器查看,使用 java -verbose 命令
类如何被JVM 加载的
最终原因是啥呢
JDK 官方文档:https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/classpath.html The order in which the JAR files in a directory are enumerated in the expanded class path is not specified and may vary from platform to platform and even from moment to moment on the same machine. A well-constructed application should not depend upon any particular order. If a specific order is required then the JAR files can be enumerated explicitly in the class path. 翻译: 相同目录下,JAR文件在JVM 中加载的顺序是无法保证,并且可能因平台而异,甚至在同一台计算机上也可能因时间而异。构造良好的应用程序不应依赖于任何特定的顺序。如果需要特定的顺序,那么可以在类路径中显式指定加载JAR文件的顺序。
至此,问题基本明了了,基本底层也搞清楚了。
后续步骤
- 在应用检测层次,需要检测出来 类冲突,需要使用 maven-enforcer-plugin 插件,正好我也负责代码检测项目(jar 冲突,版本禁用,SQL 审批等),已经罗列到议程中。
猜你喜欢
- 2024-10-16 web前端移动端最流行的网页布局技术:flexbox弹性布局学习详解
- 2024-10-16 美团团购订单系统优化记 美团团购订单系统优化记录怎么删
- 2024-10-16 6.8 Apache访问控制 控制用户访问apache目录的配置文件
- 2024-10-16 快速学会html表单提交(php) html提交表单到php
- 2024-10-16 Django开发教程(七) django开发工具
- 2024-10-16 前端配置prettier,eslint ,stylelint
- 2024-10-16 电脑绝技教你22天学精Csharp之第十八天HTML和CSS补充3
- 2024-10-16 HTML部分第四章——HTML常用标签 html标签大全及用法图解
- 2024-10-16 基于Django+mysql的点餐系统设计-第八篇(H5主页调试-静态页面)
- 2024-10-16 什么是 Promise.all 什么是suv汽车
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)