BlockHound启动报错排查:NoClassDefFoundError问题咨询
NoClassDefFoundError问题排查 你遇到的这个java.lang.NoClassDefFoundError: reactor/core/scheduler/NonBlocking异常,核心原因是Reactor和BlockHound的版本不兼容,我们来一步步拆解问题:
问题根源分析
你配置里的Reactor BOM是Bismuth-RELEASE,这是Reactor比较早期的稳定版本(对应Spring Boot 2.1.x系列),而reactor.core.scheduler.NonBlocking这个类是在Reactor的Dysprosium版本及之后才新增的,Bismuth版本的reactor-core里根本没有这个类。
同时你的BlockHound依赖没有指定版本,也没放在test scope里,Maven会自动拉取最新的BlockHound版本——这些新版本的BlockHound已经依赖了那个新添加的NonBlocking接口,自然就会出现找不到类的错误。
另外你还注释掉了blockhound-junit-platform依赖,这个是在JUnit 5环境下启动BlockHound的必要依赖,没有它的话测试也没法正常触发BlockHound的检测逻辑。
解决方案
根据你的需求,有两种修正方式:
方案一:升级Reactor版本(推荐)
把Reactor BOM升级到和BlockHound兼容的新版本,比如Dysprosium-SR18(适配Spring Boot 2.2.x)或者更晚的版本,同时指定匹配的BlockHound版本,并且修正依赖的scope:
<dependencies> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-launcher</artifactId> <version>1.6.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.6.2</version> <scope>test</scope> </dependency> <!-- 恢复blockhound-junit-platform依赖 --> <dependency> <groupId>io.projectreactor.tools</groupId> <artifactId>blockhound-junit-platform</artifactId> <version>1.0.6.RELEASE</version> <scope>test</scope> </dependency> <!-- 指定兼容的BlockHound版本,放到test scope --> <dependency> <groupId>io.projectreactor.tools</groupId> <artifactId>blockhound</artifactId> <version>1.0.6.RELEASE</version> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-bom</artifactId> <!-- 升级到兼容的Reactor BOM版本 --> <version>Dysprosium-SR18</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
方案二:降级BlockHound适配老Reactor
如果你必须保留Bismuth-RELEASE的Reactor版本,那需要使用和它兼容的旧版BlockHound(比如1.0.0.RELEASE),这个版本还没有依赖NonBlocking接口:
<!-- 只修改BlockHound相关依赖 --> <dependency> <groupId>io.projectreactor.tools</groupId> <artifactId>blockhound-junit-platform</artifactId> <version>1.0.0.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor.tools</groupId> <artifactId>blockhound</artifactId> <version>1.0.0.RELEASE</version> <scope>test</scope> </dependency>
额外注意点
- BlockHound是用于测试阶段检测异步代码中的阻塞调用,所以一定要把它的依赖scope设置为
test,避免打包到生产包中。 - 确保JUnit版本和BlockHound版本的兼容性,比如你用的JUnit 5.6.2,搭配BlockHound 1.0.x版本是没问题的。
内容的提问来源于stack exchange,提问作者Shady Ragab

