测试Flux服务时遭遇java.lang.ClassNotFoundException: reactor.core.scheduler.TimedScheduler
解决
java.lang.ClassNotFoundException: reactor.core.scheduler.TimedScheduler问题 嘿,这个错误我之前在写WebFlux测试的时候也碰到过,本质就是依赖缺失或者版本不兼容搞的鬼。TimedScheduler是Reactor Core库里面的一个调度器接口,你的测试环境找不到它,大概率是下面几种情况:
可能的触发原因
- Reactor Core版本太老:
TimedScheduler是Reactor Core 3.4.0及以后版本才新增的接口,如果你的项目里依赖的Reactor Core版本低于这个,自然会出现找不到类的问题。 - Spring Boot与Reactor版本不兼容:Spring Boot本身会统一管理Reactor的依赖版本,要是你手动指定了Reactor的版本,或者使用了不匹配的Spring Boot版本,很容易引发依赖冲突,导致正确版本的Reactor Core没被引入到测试环境中。
- 测试依赖配置不全:你用到了
StepVerifier(来自reactor-test库),但要么没配套引入对应的Reactor Core依赖,要么reactor-test和Reactor Core的版本不一致,也会触发这个异常。
一步步修复的办法
1. 统一Reactor版本(如果手动指定了版本)
如果你在pom.xml(Maven)或者build.gradle(Gradle)里手动声明了Reactor相关依赖的版本,一定要保证reactor-core和reactor-test的版本一致,且不低于3.4.0:
- Maven示例:
<dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> <version>3.5.11</version> <!-- 推荐使用最新稳定版或与Spring Boot兼容的版本 --> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <version>3.5.11</version> <scope>test</scope> </dependency>
- Gradle示例:
testImplementation 'io.projectreactor:reactor-test:3.5.11' implementation 'io.projectreactor:reactor-core:3.5.11'
2. 依赖Spring Boot的自动管理(最省心的方案)
既然你用到了WebTestClient和Flux,肯定是WebFlux项目,那最好不要手动指定Reactor版本,直接通过Spring Boot的starter来管理所有依赖:
- Maven只需引入这两个starter即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
- Gradle:
implementation 'org.springframework.boot:spring-boot-starter-webflux' testImplementation 'org.springframework.boot:spring-boot-starter-test'
spring-boot-starter-test已经内置了reactor-test,不需要单独引入,这样所有依赖版本都会自动保持兼容,避免版本冲突问题。
3. 清理依赖缓存并重新构建
有时候本地依赖缓存会导致版本冲突残留,你可以执行以下命令清理缓存后重新构建项目:
- Maven:
mvn clean install -U
- Gradle:
./gradlew clean build --refresh-dependencies
验证修复
调整完依赖后,重新运行你的测试代码:
FluxExchangeResult<Event> result = webTestClient.get() .uri("/events") .accept(MediaType.TEXT_EVENT_STREAM) .exchange() .expectStatus() .isOk() .returnResult(Event.class); Flux<Event> eventFlux = result.getResponseBody(); StepVerifier.create(eventFlux) .expectNextCount(10) .expectComplete() .verify();
如果依赖问题解决,这个测试就能正常执行,不会再抛出ClassNotFoundException异常了。
内容的提问来源于stack exchange,提问作者Karan Khanna
相关产品推荐
相关产品推荐

