Guice未命名模块错误:Java16下AbstractModule获取外部Jar类抛ClassCastException
问题解决思路
根本原因
你遇到的报错本质是类加载器冲突:com.awooga.profiles.ProfilesPaperCorePlugin 类被两个独立的类加载器分别加载,一个属于 profiles-paper-core-1.0-SNAPSHOT-all.jar,另一个属于你自己的 myJar.jar。Java中类的唯一性由「类加载器实例+全限定类名」共同决定,即使全类名完全一致,不同类加载器加载的类也不属于同一类型,因此会抛出类型转换异常。
Java 11升级到16后报错,是因为Java 9引入的模块系统对类加载的隔离规则更严格,加上Paper服务端本身对每个插件都会分配独立的类加载器,进一步放大了重复依赖的问题。
解决方案
核心逻辑是避免把公共依赖的类重复打进自己的插件包,统一使用服务端加载的公共依赖类:
- 修改项目构建配置,将
profiles-paper-core依赖的作用域改为provided,打包时排除该依赖的所有类。- Gradle(shadowJar打包)配置参考:
shadowJar { // 排除core包的类文件 exclude 'com/awooga/profiles/**' dependencies { exclude(dependency('com.awooga:profiles-paper-core')) } }- Maven(shade插件打包)配置参考:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <artifactSet> <excludes> <exclude>com.awooga:profiles-paper-core</exclude> </excludes> </artifactSet> </configuration> </execution> </executions> </plugin> - 你现有的
AbstractModule代码不需要做任何修改,只要保证依赖的ProfilesPaperCoreSDK是服务端profiles-paper-core插件加载的类,类加载器统一后调用getInstance()拿到的实例就可以正常使用。
额外说明
你之前猜测的给模块命名无法解决该问题:即使给模块命名,只要两个类加载器各自加载了一次相同全类名的类,依然会出现类型转换失败的问题,核心还是要避免重复打包公共依赖。
内容的提问来源于stack exchange,提问作者Junhyung
相关产品推荐
相关产品推荐

