Java加载错误库抛出NoClassDefFoundError:找不到GrammarReaderController
问题分析与解决方案
核心原因
你遇到的问题本质是org-project-execution.jar内部代码未正确引用shaded后的类路径:
- 虽然该jar已将
com.sun.msv.reader.GrammarReaderController重定位到com.ctc.wstx.shaded.msv_core.reader.GrammarReaderController,但jar内的Executor类(或其依赖的其他类)字节码中,仍然硬编码引用了原始包路径com.sun.msv.reader.GrammarReaderController。 - 编译阶段因你手动导入了shaded类,所以编译通过;但运行时JVM执行
Executor.execute方法时,会尝试加载代码中实际引用的原始路径类,而非你导入的shaded类。
次要诱因
- Shading打包不彻底:使用Maven Shade或类似插件打包时,仅完成了类的移动,未配置
relocation规则批量替换所有依赖类中的引用路径,导致代码中的类全限定名未被更新。 - 类加载冲突:额外添加的
msv-core-2022.7-jar-with-dependencies.jar可能与org-project-execution.jar中的shaded类产生路径混淆,但这并非核心问题——即使不加这个jar,你依然会遇到相同错误。
解决步骤
验证jar内部的引用路径
用反编译工具(如JD-GUI)打开org-project-execution.jar,找到org.project.execution.Executor类,查看其调用GrammarReaderController的代码,确认引用的是原始路径还是shaded后的路径。如果是前者,说明打包时未更新引用。重新配置Shading打包规则
若使用Maven Shade插件,确保在pom.xml中添加完整的relocation配置,将原始包路径映射到shaded路径,示例配置:<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> <relocations> <relocation> <pattern>com.sun.msv</pattern> <shadedPattern>com.ctc.wstx.shaded.msv_core</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin>该配置会自动修改所有依赖类中对
com.sun.msv包下类的引用,替换为shaded后的路径。排查类加载日志
运行Java程序时添加-verbose:class参数,查看类加载的详细日志:java -verbose:class -cp "your-classpath" your.main.Class在日志中搜索
com.sun.msv.reader.GrammarReaderController,确认JVM尝试从哪个jar加载该类,以及是否存在加载失败的情况,进一步定位问题。移除冗余依赖
由于org-project-execution.jar已包含shaded后的GrammarReaderController类,无需额外添加msv-core-2022.7-jar-with-dependencies.jar,移除该jar后再测试,避免类路径冲突。
内容的提问来源于stack exchange,提问作者teowey
相关产品推荐
相关产品推荐

