SpringBoot Jenkins运行测试报DevToolsLogFactory NoSuchMethodException异常
问题根因
- Spring Boot版本严重不兼容:项目核心Spring Boot依赖版本为1.2.4.RELEASE,但是单独指定了spring-boot-devtools的版本为2.5.5,跨大版本的组件类结构完全不匹配。2.x版本的
DevToolsLogFactory$Listener类没有无参构造方法,而1.2.x版本的Spring Boot加载监听器时强制要求无参构造,就抛出了NoSuchMethodException异常。 - 环境执行逻辑差异:Eclipse本地运行测试时,默认会自动排除
runtimescope的devtools依赖,不会触发devtools的加载逻辑;而Jenkins执行Maven测试时会完整加载所有runtime scope的依赖,就会触发不兼容问题。 - 次要问题:测试类使用了已废弃的
@SpringApplicationConfiguration注解,且maven-surefire-plugin版本过旧(2.4.2为2008年的历史版本),也可能放大环境差异导致的执行异常。
修复方案
按优先级从高到低选择即可:
方案1(成本最低,优先选择):测试/构建阶段排除devtools依赖
devtools仅用于本地开发热部署,测试和线上环境不需要引入,修改pom.xml中devtools的依赖配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>2.5.5</version> <scope>runtime</scope> <optional>true</optional> <!-- 新增这行,只有本地开发会加载,打包和测试阶段不会引入 --> </dependency>
如果配置后仍未生效,可同步升级maven-surefire-plugin并配置强制排除devtools:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <!-- 升级为适配Spring Boot 1.x的稳定版本 --> <configuration> <classpathDependencyExcludes> <classpathDependencyExclude>org.springframework.boot:spring-boot-devtools</classpathDependencyExclude> </classpathDependencyExcludes> </configuration> </plugin>
方案2(彻底解决兼容问题):统一Spring Boot版本
要么将spring-boot-devtools的版本降级到和核心依赖一致的1.2.4.RELEASE,要么将整个项目的Spring Boot版本统一升级到2.5.5,同步更新测试类的废弃注解:
@RunWith(SpringRunner.class) @SpringBootTest(classes = WebApplication.class) // 替换旧的@SpringApplicationConfiguration注解 @WebAppConfiguration public class BanksMvcControllerTest { @Test public void contextLoads() { } }
临时验证方案
如果需要Jenkins测试快速跑通,可直接执行Maven命令时添加参数关闭devtools:mvn test -Dspring.devtools.restart.enabled=false -Dspring.devtools.livereload.enabled=false
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

