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

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

org.slf4j.impl

org.slf4j.bridge

ch.qos.logback.core.joran.spi

...

ch.qos.logback.classic

ch.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?

以上是 请教一下java.lang.LinkageError的根本原因是什么? 的全部内容, 来源链接: utcz.com/p/945339.html

回到顶部