问题描述
在 CatServer 1.12.2 环境中,插件启用时只要触发 org.bukkit.DyeColor 的类初始化,就会导致服务端抛出 ExceptionInInitializerError。
异常根因来自 DyeColor.<clinit> 中构建 ImmutableMap<Color, DyeColor> 时出现重复 key:
java.lang.IllegalArgumentException: Multiple entries with same key: Color:[rgb0x474F52]=GRAY and Color:[rgb0x474F52]=GRAY
异常堆栈关键部分
Caused by: java.lang.IllegalArgumentException: Multiple entries with same key: Color:[rgb0x474F52]=GRAY and Color:[rgb0x474F52]=GRAY
at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:186)
at com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:102)
at com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:88)
at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:359)
at org.bukkit.DyeColor.<clinit>(DyeColor.java:206)
触发方式
任意调用会触发 DyeColor 静态初始化的方法都可能复现,例如:
或间接调用羊实体颜色相关方法:
预期行为
DyeColor 应该可以正常完成静态初始化,DyeColor.values() 不应抛出异常。
实际行为
DyeColor 在静态初始化 BY_COLOR / BY_FIREWORK 映射时失败,导致依赖 DyeColor 的插件无法启用或相关功能运行时报错。
初步分析
从 Bukkit 1.12.2 的 DyeColor 源码看,16 个枚举项的 Color.fromRGB(...) 值并不存在重复,0x474F52 只对应 GRAY。
但运行时报错显示:
Color:[rgb0x474F52]=GRAY and Color:[rgb0x474F52]=GRAY
两个冲突 value 都是 GRAY,这不像是正常枚举颜色重复,更像是 CatServer 运行时的 DyeColor / Color 实现、字节码打包或类加载存在异常。
影响
依赖 Bukkit DyeColor 的插件可能无法启动,或在相关功能运行时报错,例如:
DyeColor.values();
Sheep#getColor();
DyeColor#getByColor(...);
在本次问题中,插件注册命令补全时调用了 DyeColor.values(),因此在插件启用阶段直接失败。
环境
- 服务端核心: CatServer 1.12.2
- Java 版本: 1.8.0_481
- Guava: 21.0
问题描述
在 CatServer 1.12.2 环境中,插件启用时只要触发
org.bukkit.DyeColor的类初始化,就会导致服务端抛出ExceptionInInitializerError。异常根因来自
DyeColor.<clinit>中构建ImmutableMap<Color, DyeColor>时出现重复 key:异常堆栈关键部分
触发方式
任意调用会触发
DyeColor静态初始化的方法都可能复现,例如:或间接调用羊实体颜色相关方法:
预期行为
DyeColor应该可以正常完成静态初始化,DyeColor.values()不应抛出异常。实际行为
DyeColor在静态初始化BY_COLOR/BY_FIREWORK映射时失败,导致依赖DyeColor的插件无法启用或相关功能运行时报错。初步分析
从 Bukkit 1.12.2 的
DyeColor源码看,16 个枚举项的Color.fromRGB(...)值并不存在重复,0x474F52只对应GRAY。但运行时报错显示:
两个冲突 value 都是
GRAY,这不像是正常枚举颜色重复,更像是 CatServer 运行时的DyeColor/Color实现、字节码打包或类加载存在异常。影响
依赖 Bukkit
DyeColor的插件可能无法启动,或在相关功能运行时报错,例如:在本次问题中,插件注册命令补全时调用了
DyeColor.values(),因此在插件启用阶段直接失败。环境