Minecraft Fabric模组经Proguard混淆后invoke调用报错如何解决?
问题原因
这个报错是Proguard混淆工具的已知bug,和事件系统、模组业务逻辑没有关系。
你使用的Java 7+ 多异常捕获语法catch (InvocationTargetException | IllegalAccessException e)在搭配类重打包(也就是你配置的将所有类重打包到dev.mistercow1.minecraftmod目录)的场景下,部分版本的Proguard会错误修改异常变量的类型标记,把原本的异常类类型错误标记为java.lang.Object,导致JVM加载类的时候校验不通过,抛出你看到的VerifyError。
解决方案
你可以任选以下一种方案修复:
- 拆分多异常捕获块,把合并的catch拆分为两个独立的catch块,不需要修改任何混淆配置即可生效:
catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }
- 升级Proguard到7.2.0及以上版本,该版本已经修复了多异常捕获搭配类重打包的类型处理bug。
- 在Proguard配置中添加核心反射异常类的保留规则,避免混淆破坏异常类的继承关系:
-keep class java.lang.ReflectiveOperationException { *; } -keep class * extends java.lang.ReflectiveOperationException { *; }
你之前修改invoke调用参数的操作没有效果,是因为报错实际发生在catch块的异常处理逻辑,和反射调用本身无关。
内容的提问来源于stack exchange,提问作者MisterCow1
相关产品推荐
相关产品推荐

