当前位置: 首页 > wzjs >正文

东莞企业网站建设推广腾讯与中国联通

东莞企业网站建设推广,腾讯与中国联通,如何上传到自己的网站,上海市政大厅官网出现问题: 原因:导入第三方sdk 解决思路:刷新maven,清理,排除依赖 在排除掉可能的依赖后发现还是不行,分析依赖关系,打开idea自带的maven树查看工具: 通过maven依赖图谱我们发现&…

出现问题:

原因:导入第三方sdk

解决思路:刷新maven,清理,排除依赖

在排除掉可能的依赖后发现还是不行,分析依赖关系,打开idea自带的maven树查看工具:

通过maven依赖图谱我们发现,所有的日志依赖都来源于spring-boot-starter,这也是Springboot的祖宗依赖,并且,该sdk是一整个完整的SpringBoot工程,而不是常见的模块式。

直接排他祖宗:

问题解决,分析出现原因:

根本原因:jvm的类加载机制

问题产生过程:两个项目的依赖版本不同,假设我们项目是:

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.10</version>
</dependency>

引入的第三方sdk中的依赖是:

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>

Spring Boot 启动时,类加载器的行为如下:

步骤 1:类加载器扫描 classpath

Spring Boot 启动时,ApplicationClassLoader 负责扫描 classpath 下的 JAR 文件,发现:

  • logback-classic-1.2.10.jar(来自我们的项目依赖)

  • logback-classic-1.2.3.jar(来自 SDK)

Java 规定 同一个类(全限定名相同),只能被一个类加载器加载一次,否则会导致冲突。

步骤 2:类加载器加载 SLF4J

SLF4J 主要涉及以下类:

  • org.slf4j.LoggerFactory (SLF4J 的核心类)

  • org.slf4j.impl.StaticLoggerBinder(绑定具体日志实现)

Spring Boot 在初始化日志时,会执行:

Logger logger = LoggerFactory.getLogger(MyApp.class);

这时,类加载器会加载 org.slf4j.impl.StaticLoggerBinder 类,而这个类分别存在于:

  • logback-classic-1.2.10.jar

  • logback-classic-1.2.3.jar

假设 ApplicationClassLoader 先加载 logback-classic-1.2.3.jar,这时 JVM 缓存了老版本,但你的 logback-classic-1.2.10.jar 中的方法签名可能发生了变化。


3. 发生 AbstractMethodError 的原因

由于 logback-classic-1.2.3.jar较早的版本,它可能没有某些方法,比如:

// 1.2.3 版本的方法
public boolean supportsSourceType(Class<?> sourceType) { return true; }
​
// 1.2.10 版本方法(升级后可能有不同签名)
public boolean supportsSourceType(Class<?> sourceType, boolean flag) { return true; }

然后 Spring Boot 依赖的是 logback-classic-1.2.10.jar 版本的方法:

listenerAdapter.supportsSourceType(someClass);

但由于 logback-classic-1.2.3.jar 已经被类加载器加载,JVM 仍然调用的是老版本的方法,而 logback-classic-1.2.3.jar 里没有这个方法,就会发生 AbstractMethodError

Exception in thread "main" java.lang.AbstractMethodErrorat org.springframework.context.event.GenericApplicationListenerAdapter.supportsSourceType

总结:

  1. 类加载器只能加载一个类的一个版本,如果 logback-classic-1.2.3.jar 先被加载,Spring Boot 调用新版本的方法就会失败。

  2. 方法签名变化导致 AbstractMethodError,因为类加载器仍然引用的是旧的 logback-classic-1.2.3.jar 版本,而新代码需要 1.2.10 的方法。

  3. 该SDK是完整的SpringBoot工程,而不是模块,模块化 SDK 可以通过适当的 类加载器管理、依赖管理、版本对齐 等方式,确保它的日志框架不会影响到 Spring Boot 项目的日志实现

http://www.dtcms.com/wzjs/154989.html

相关文章:

  • 昵图网站党风廉政建设公众号怎么推广
  • 网站建设范文用网站模板建站
  • 武汉网站网站建设重大新闻事件
  • 做网站开发的有哪些公司好站长工具大全
  • 多软件网站下载安装做网站用什么软件好
  • 旅游网站制作建设网站推广的基本方法有
  • 企业网站的常见服务seo短视频加密路线
  • Wordpress网站转zblog汕头seo代理商
  • 漳州住房和城乡建设部网站网络营销专业学什么课程
  • 网站开发最新流程近几年的网络营销案例
  • 优推宝可以做自己网站吗十大跨界营销案例
  • 代办公司注册商务服务网络优化公司排名
  • 做网站和网页有什么区别网络营销是什么工作
  • 做企业网站后期还需要费用吗视频外链平台
  • 长春建站方案百度网页电脑版入口
  • 自助建站系统php搜索推广公司
  • wordpress环境需求百度seo推广价格
  • 服务型网站的营销特点5118网站如何使用免费版
  • 深圳企业高端网站建设适合发软文的平台
  • 国内做网站建设知名的公司日本比分预测
  • 动漫在线制作网站济南百度推广公司电话
  • b2c网站可分为百度公司电话是多少
  • 网站工作室 需要什么手续网络优化公司哪家好
  • 建设网站审批网站seo优化网站
  • 建设学院网站的通知书十大接单推广app平台
  • 南昌做网站市场报价个人博客模板
  • 山东专业网站seo百度seo优化排名
  • 网站上传大小限制西安外包公司排行
  • 罗湖公司网站建设sem推广代运营
  • 龙岩网站制作太原seo服务