添加obliviate-invs依赖后Jar包出现NoClassDefFoundError问题求助
PaperSpigot插件中
NoClassDefFoundError: mc/obliviate/inventory/Gui问题分析与标准解决方法 问题根源
出现这个错误的核心原因是打包后的插件Jar中缺少obliviate-invs库的相关类文件,具体可能由以下情况导致:
- Maven依赖配置错误:比如将依赖的
scope设为provided,导致打包时不会将依赖类包含进Jar; - 打包插件配置不当:maven-shade-plugin、maven-assembly-plugin等插件未正确配置,未能将依赖类合并到最终Jar中;
- Maven/IDE缓存问题:本地仓库的依赖文件不完整,或IDE缓存了旧的构建结果,导致打包时未引入完整的依赖类;
- 多打包插件冲突:同时使用shade、assembly等插件,导致打包逻辑混乱,依赖类被意外排除。
标准解决方案
1. 修正Maven依赖配置
确保obliviate-invs的依赖scope为默认的compile(无需显式声明),不要设置为provided,示例配置:
<dependency> <groupId>com.github.hamza-cskn.obliviate-invs</groupId> <artifactId>core</artifactId> <version>4.1.13</version> </dependency>
2. 正确配置maven-shade-plugin(推荐方案)
maven-shade-plugin是Spigot/Paper插件打包依赖的标准工具,它能将依赖类直接合并到插件Jar中,避免类加载问题。完整配置示例:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 明确包含obliviate-invs的所有类 --> <includes> <include>mc/obliviate/**</include> </includes> <!-- 可选但推荐:重命名依赖包路径,避免与其他插件的同依赖版本冲突 --> <relocations> <relocation> <pattern>mc.obliviate</pattern> <shadedPattern>你的插件包路径.libs.mc.obliviate</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build>
3. 清理缓存并重新构建
- 执行Maven命令:
mvn clean install,清理旧的构建产物和本地缓存,重新拉取完整依赖并打包; - 在IntelliJ IDEA中,通过
File -> Invalidate Caches...清理IDE缓存,然后点击Reload All Maven Projects重新加载项目。
4. 验证打包结果
解压生成的插件Jar包,检查是否存在mc/obliviate/inventory/Gui.class文件。如果存在,说明打包正确;如果不存在,回到打包配置重新检查。
常见误区规避
- 不要同时使用maven-shade-plugin和maven-assembly-plugin,两者功能重叠,会导致打包逻辑冲突;
- 不要使用One-Jar打包,它的类加载机制与Spigot的插件类加载器不兼容,会导致依赖类无法被正确加载。
内容的提问来源于stack exchange,提问作者Timas_bro
相关产品推荐
相关产品推荐

