当前位置: 首页 > 知识库问答 >
问题:

请教一下java.lang.LinkageError的根本原因是什么?

娄森
2023-09-18

问题描述:
我在尝试将springboot应用集成到另一个容器中时候,计划是将springboot应用的日志统一到另一个容器中进行管理,所以,特别处理了下springboot org.springframework.boot.loader.LaunchedURLClassLoader 的委托加载关系,将若干日志package委托 parent加载:
比如:

org.slf4j.implorg.slf4j.bridgech.qos.logback.core.joran.spi...ch.qos.logback.classicch.qos.logback.classic.joran...

由于遗漏了 ch.qos.logback.classic.spi.TurboFilterList 所在包ch.qos.logback.classic.spi的委托关系,所以,运行时报错如下:

Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/springframework/boot/loader/LaunchedURLClassLoader) previously initiated loading for a different type with name "ch/qos/logback/classic/spi/TurboFilterList"

报错的源码位置:

我现在的疑问是:
对Springboot的LaunchedURLClassLoader来说,
ch.qos.logback.classic.spi.TurboFilterList类应该是由 LaunchedURLClassLoader来定义的,然而:loggerContext.getTurboFilterList() 返回的对象类“TurboFilterList” 是由parent classloader 来定义的, 所以,报错不应该是:ClassCastException 吗?
为什么却是在 ClassLoader.defineClass 时抛出了一个LinkageError?

共有1个答案

莘光华
2023-09-18

java.lang.LinkageError的根本原因是因为在定义类时使用了不同的类加载器,导致类之间的依赖关系出现问题。在你的情况下,ch.qos.logback.classic.spi.TurboFilterList类是由父类加载器定义的,而LaunchedURLClassLoader在定义自己的类时使用了不同的类加载器,导致两者之间的依赖关系出现问题。

具体来说,当你使用LaunchedURLClassLoader加载ch.qos.logback.classic.spi.TurboFilterList类时,它尝试定义一个名为"ch/qos/logback/classic/spi/TurboFilterList"的类。但是,在这个时候,一个加载器正在使用这个名字来定义另一个不同的类。这导致两个类之间出现了命名冲突,导致了LinkageError。

具体来说,当你使用LaunchedURLClassLoader加载ch.qos.logback.classic.spi.TurboFilterList类时,它尝试定义一个名为"ch/qos/logback/classic/spi/TurboFilterList"的类。但是,在这个时候,一个加载器正在使用这个名字来定义另一个不同的类。这导致两个类之间出现了命名冲突,导致了LinkageError。

对于你的问题,我建议你在处理LaunchedURLClassLoader的委托加载关系时,确保所有依赖关系都正确设置,并且不会出现命名冲突。这可能需要你重新审视你的代码逻辑,确保所有依赖关系都被正确处理,并且没有出现命名冲突的情况。

 类似资料:
  • 问题内容: 我有这个小代码,用于将我的jsp连接到我的mysql数据库。 我已将连接器添加到我的构建路径中: 但我仍然收到此错误: java.lang.ClassNotFoundException:com.mysql.jdbc.Driver 有人可以帮我吗? 问题答案: 构建路径用于编译目的(假设您没有将mysql连接器jar包含在软件包中的代码)。 如果这是Web应用程序,请将其添加到lib文件

  • 问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo

  • 在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队

  • 本文向大家介绍什么是OutOfMemoryError以及查找Java中OOM根本原因的步骤?,包括了什么是OutOfMemoryError以及查找Java中OOM根本原因的步骤?的使用技巧和注意事项,需要的朋友参考一下 该OutOfMemoryError异常 被抛出JVM,当JVM没有足够的可用内存,来分配。OutOfMemoryError 在Exception 类层次结构中属于E rror类别。

  • 主要内容:前言,查询慢深层次原因揭秘:磁盘IO的过程,磁盘的顺序读写和随机读写,磁盘IO到底会有多慢呢?,用户查询请求慢的根本原因前言 接上一节,那么,一次查询的全过程是什么样的呢? 这个时候,我们通过各种百度和Google,然后加上自己的理解,终于搞明白了MySQL一次查询的全过程了。 首先,用户想要查询订单数据时,会先发送一个查询请求,如下图所示: 可以看到,当用户发送查询请求时,因为外卖订单项目是部署在Tomcat中的,Tomcat中的线程首先就会接收到用户的请求,然后把请求交给外卖订单项

  • 本文向大家介绍请你解释一下,通常系统CPU比较高是什么原因?相关面试题,主要包含被问及请你解释一下,通常系统CPU比较高是什么原因?时的应答技巧和注意事项,需要的朋友参考一下 考察点:处理机 1、首先查看是哪些进程的CPU占用率最高(如下可以看到详细的路径) ps -aux --sort -pcpu | more # 定位有问题的线程可以用如下命令 ps -mp pid -o THREAD,tid