使用其他模块自定义jar的类时出现java.lang.NoClassDefFoundError如何解决
运行时NoClassDefFoundError问题解决方案
这个问题是典型的编译期依赖存在、运行期依赖缺失导致的,可按以下优先级排查解决:
- 检查pom.xml中
some-jar.jar的依赖范围scope配置
如果显式配置了<scope>provided</scope>,会导致该依赖仅参与编译,不会被打包到最终部署包中,直接删除scope配置使用默认的compile范围即可。 - 校验自定义jar的依赖引入方式
如果你是通过<scope>system</scope>+<systemPath>的方式引入本地存放的自定义jar,默认该依赖不会被打包到最终的构建产物中:- 若为SpringBoot项目,在pom的
spring-boot-maven-plugin配置下添加<includeSystemScope>true</includeSystemScope>即可将system范围依赖打入最终jar - 若为传统WAR包项目,配置
maven-war-plugin将system依赖的jar复制到WEB-INF/lib目录下,示例配置:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> <configuration> <webResources> <resource> <directory>本地存放自定义jar的目录路径</directory> <targetPath>WEB-INF/lib</targetPath> <includes> <include>*.jar</include> </includes> </resource> </webResources> </configuration> </plugin>
- 若为SpringBoot项目,在pom的
- 核对多模块项目的依赖传递配置
如果是多模块Maven项目,确认some-jar的依赖是否直接声明在当前业务模块的pom中,避免仅在父模块dependencyManagement中声明未被子模块引入、或依赖声明在其他模块未设置传递的情况。 - 校验最终构建产物的依赖完整性
构建完成后解压你的部署包(jar/war),确认some-jar.jar是否存在于正确的类路径目录下(SpringBoot jar对应BOOT-INF/lib,WAR包对应WEB-INF/lib),如果不存在需调整打包插件的排除规则,避免该依赖被意外排除。 - 适配容器类加载规则
如果你使用的是外置Web容器(如Tomcat、WebLogic)部署,部分容器会优先加载自身公共lib目录下的类,若存在同名类冲突可调整容器类加载优先级为优先加载应用自身的类,也可直接将some-jar.jar放到容器的公共lib目录中。
内容的提问来源于stack exchange,提问作者hitesh
相关产品推荐
相关产品推荐

