请教一下java.lang.LinkageError的根本原因是什么?
问题描述:
我在尝试将springboot应用集成到另一个容器中时候,计划是将springboot应用的日志统一到另一个容器中进行管理,所以,特别处理了下springboot org.springframework.boot.loader.LaunchedURLClassLoader 的委托加载关系,将若干日志package委托 parent加载:
比如:
org.slf4j.implorg.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