外部库中JUnit5 TestExecutionListener无法加载的问题解决
问题根源
你碰到的ServiceConfigurationError,核心问题出在SPI配置文件没被打进FooLibrary的主Jar包,而且类加载路径不匹配:
- 你把SPI配置文件放在了FooLibrary的
src/test/resources目录下,这个目录的内容只会被打包到测试专用Jar中,不会进入主Jar; - 测试项目依赖的是FooLibrary的主Jar,因此JUnit的ServiceLoader根本读不到该配置,自然找不到
ResultAnalyzer类。
解决办法
1. 调整SPI配置文件的位置
把src/test/resources/META-INF/services/org.junit.platform.launcher.TestExecutionListener移动到src/main/resources/META-INF/services/目录下。这样FooLibrary打包主Jar时,会自动将该配置文件包含进去,测试项目依赖主Jar后,JUnit平台就能通过ServiceLoader找到你的自定义Listener。
2. 确认ResultAnalyzer的代码位置
确保ResultAnalyzer类位于FooLibrary的src/main/java目录下(不要放在src/test/java)。只有主源码目录下的类才会被打包到主Jar中,测试项目依赖后才能正常加载该类。(你已确认Jar包包含该类,此步骤快速核对即可)
3. 检查测试项目的Gradle依赖配置
在各测试项目(Proj_A、Proj_B等)的build.gradle中,确保FooLibrary的依赖声明为测试阶段依赖:
dependencies { testImplementation '你的groupId:FooLibrary:版本号' // 确保JUnit 5相关依赖(如junit-jupiter-api、junit-jupiter-engine)已正确引入 }
4. 可选:强制Gradle将测试依赖加入类路径
如果仍存在类加载问题,可在测试项目的build.gradle中添加以下配置,确保测试任务的类路径包含FooLibrary的所有资源:
tasks.withType(Test) { useJUnitPlatform() classpath += sourceSets.test.runtimeClasspath }
验证步骤
- 重新构建FooLibrary:执行
./gradlew clean build,检查build/libs下的主Jar包,确认其中包含META-INF/services/org.junit.platform.launcher.TestExecutionListener文件和ResultAnalyzer类; - 在测试项目中执行测试任务:
./gradlew test,查看日志是否输出[CustomTestSummary]相关内容,确认不再出现ServiceConfigurationError。
内容的提问来源于stack exchange,提问作者coldcake71
相关产品推荐
相关产品推荐

