You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务端本身对每个插件都会分配独立的类加载器,进一步放大了重复依赖的问题。

解决方案

核心逻辑是避免把公共依赖的类重复打进自己的插件包,统一使用服务端加载的公共依赖类:

  1. 修改项目构建配置,将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>
    
  2. 你现有的AbstractModule代码不需要做任何修改,只要保证依赖的ProfilesPaperCoreSDK是服务端profiles-paper-core插件加载的类,类加载器统一后调用getInstance()拿到的实例就可以正常使用。

额外说明

你之前猜测的给模块命名无法解决该问题:即使给模块命名,只要两个类加载器各自加载了一次相同全类名的类,依然会出现类型转换失败的问题,核心还是要避免重复打包公共依赖。

内容的提问来源于stack exchange,提问作者Junhyung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:06:04