SkyWalking Java Agent 9.4.0与ical4j 4.1.1类重定义冲突问题求助
SkyWalking Java Agent 9.4.0与ical4j 4.1.1类重定义冲突问题求助
各位大佬好,我最近在开发Spring Boot应用时遇到了个棘手的问题:SkyWalking Java Agent 9.4.0和ical4j 4.1.1库之间出现了类重定义冲突,导致应用直接启动失败,折腾好一阵都没搞定,来求助大家!
环境信息
- SkyWalking Java Agent:9.4.0
- SkyWalking Server:10.2.0
- Java SDK:21
- 框架:基于Jakarta EE的Spring Boot,搭配Spring Data JPA、Spring MVC
- 问题依赖:ical4j(org.mnode.ical4j)版本4.1.1
问题现象
当我移除ical4j依赖时,应用搭配SkyWalking Agent能正常启动运行;但只要引入ical4j,启动瞬间就会触发类重定义失败的错误,直接崩溃。
错误栈信息
java.lang.UnsupportedOperationException: class redefinition failed: attempted to change superclass or interfaces at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method) at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:225) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.skywalking.apm.dependencies.net.bytebuddy.utility.Invoker$Dispatcher.invoke(Unknown Source) at org.apache.skywalking.apm.dependencies.net.bytebuddy.utility.dispatcher.JavaDispatcher$Dispatcher$ForNonStaticMethod.invoke(JavaDispatcher.java:1032) at org.apache.skywalking.apm.dependencies.net.bytebuddy.utility.dispatcher.JavaDispatcher$ProxiedInvocationHandler.invoke(JavaDispatcher.java:1162) at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.$Proxy46.retransformClasses(Unknown Source) at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy$Collector$ForRetransformation.doApply(AgentBuilder.java:8336) at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy$Collector.apply(AgentBuilder.java:8151) at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy.apply(AgentBuilder.java:5848) at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$Default.doInstall(AgentBuilder.java:11462) at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$Default.installOn(AgentBuilder.java:11362) at org.apache.skywalking.apm.agent.SkyWalkingAgent.installClassTransformer(SkyWalkingAgent.java:152) at org.apache.skywalking.apm.agent.SkyWalkingAgent.premain(SkyWalkingAgent.java:105) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:560) at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:572)
问题分析
根据错误信息我大概判断:SkyWalking Agent在尝试重转换ical4j的类(org.mnode.ical4j.*下的类)时,发现这些类已经被加载,且它们的超类或接口定义和Agent要修改后的定义不一致,导致类重定义操作直接失败,进而触发启动异常。
已尝试的解决方法
我已经在SkyWalking的agent.config里调整了一堆配置,试图让Agent跳过对ical4j类的处理,但都没效果:
agent.class_cache_mode=OFFagent.is_cache_enhanced_class=falseagent.is_open_debugging_class=trueagent.is_parallel_class_transform=falseagent.trace.ignore_path=/org/mnode/**,org/mnode/ical4j/**plugin.toolkit.log.ignore_filters=org.mnode.ical4j.*
现在实在没思路了,想请教各位:有没有办法让SkyWalking Agent完全跳过对ical4j所有类的增强和转换?或者还有其他可行的解决方向吗?
内容来源于stack exchange




