运行SpringBoot测试用例时遭遇NoClassDefFoundError: javax/servlet/ServletException错误
Spring Boot测试上下文加载失败:javax.servlet.ServletException缺失问题解决
问题详情
依赖配置
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.3.RELEASE</version> <relativePath/> </parent> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <!--<version>2.1.8.RELEASE</version>--> <scope>compile</scope> <!--<scope>compile</scope>--> </dependency>
测试代码片段
@Autowired AutowireCapableBeanFactory beanFactory;
报错信息
java.lang.NoClassDefFoundError: javax/servlet/ServletException at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at org.springframework.boot.SpringApplication.createApplicationContext(SpringApplication.java:587) at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:111) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletException at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 29 more
问题原因
- Scope配置错误:
spring-boot-starter-test默认scope为test,其中依赖的servlet-api等组件scope是provided。将test依赖的scope改为compile后,这些provided级别的依赖不会被自动引入classpath,导致测试运行时找不到javax.servlet.ServletException类。 - 版本冲突风险:注释掉的
2.1.8.RELEASE版本与父依赖1.4.3.RELEASE版本差异过大,极易引发依赖冲突,进一步导致上下文加载失败。
解决方案
方案1:修正test依赖的scope(推荐)
将spring-boot-starter-test的scope改回默认的test,测试依赖无需编译到生产代码中,同时能自动引入所需组件:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
方案2:统一依赖版本
所有Spring Boot相关依赖版本需与父依赖保持一致,无需手动指定test依赖版本(父依赖会自动管理版本),避免版本冲突。
方案3:手动引入servlet-api(仅当必须在编译阶段使用test组件时)
如果确实需要将test依赖的scope设为compile,需手动添加servlet-api依赖:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <!-- 与Spring Boot 1.4.x版本兼容 --> <scope>compile</scope> </dependency>
内容的提问来源于stack exchange,提问作者divyanshu gupta
相关产品推荐
相关产品推荐

