是什么导致 java.lang.ClassLoader$ByteBuddyAccessor$V1 具有注入策略的重复类定义?

问题描述 投票:0回答:0

当更新到 bytebuddy 1.12.22 时,我们开始偶尔看到异常表明 java.lang.ClassLoader$ByteBuddyAccessor$V1(已经)在加载程序“bootstrap”的模块 java.base 中。 我们的战争中包含了 bytebuddy(隐藏在我们的一个罐子中)。当我们在同一个 tomcat 实例中运行多个 war 时,我们只会偶尔看到这个问题。对于只有 1 个 war 或简单的单一类路径应用程序的 tomcat 实例,从来没有问题。

我们正在调用 DynamicType.Unloaded.load 并使用同一战争中的类的类加载器和 ClassLoadingStrategy.Default.INJECTION 策略。

https://javadoc.io/static/net.bytebuddy/byte-buddy/1.14.4/net/bytebuddy/dynamic/DynamicType.Unloaded.html#load-S-net.bytebuddy.dynamic.loading.ClassLoadingStrategy-

失败并显示消息:

java.lang.UnsupportedOperationException: Cannot define class using reflection: java.lang.LinkageError: loader 'bootstrap' attempted duplicate class definition for java.lang.ClassLoader$ByteBuddyAccessor$V1. (java.lang.ClassLoader$ByteBuddyAccessor$V1 is in module java.base of loader 'bootstrap')

看起来有一个变化,从生成一个访问器类,从随机命名到总是使用“V1”。 https://github.com/raphw/byte-buddy/commit/201c6b69480b5b9ee35b5cdc9e35fb1bab2005dc#diff-f2e06c83c21b2a52e4ebf4392e271c68d13cdc2e5fba055773f1ffd81ce18 776

这是预期的行为吗?是否不允许在同一个tomcat实例中的多个war中有byte buddy,或者至少如果使用INJECTION策略是不允许的?

java byte-buddy
© www.soinside.com 2019 - 2024. All rights reserved.