Gradle多模块SpringBoot集成测试依赖扫描失败问题
我之前踩过几乎一模一样的坑,结合你的场景(Spring Boot 2.0.0.RC1 + Gradle多项目 + @SpringBootTest随机端口),给你几个针对性的排查和解决思路:
修复Spring Boot插件的Jar任务冲突
Spring Boot插件默认会禁用标准的jar任务,转而生成可执行的bootJar。但集成测试需要的是普通编译输出的jar,而不是可执行jar。你需要在Spring Boot子项目的build.gradle里重新启用jar任务,并区分开两个jar包:bootJar { enabled = true // 保留可执行jar生成 } jar { enabled = true archiveClassifier.set('plain') // 给普通jar加后缀,避免和bootJar冲突 }这样测试类就能正确识别到兄弟项目的编译产物了。
强制测试任务依赖兄弟项目的编译输出
有时候Gradle的默认依赖传递不会把兄弟项目的编译产物自动加入测试类路径(尤其是Spring Boot插件修改了默认任务逻辑后)。你可以在Spring Boot子项目的build.gradle里显式配置测试任务:test { // 确保兄弟项目先完成编译 dependsOn ':sibling-project:compileJava' // 把兄弟项目的主代码输出加入测试类路径 classpath += files(project(':sibling-project').sourceSets.main.output) }检查Spring Boot的组件扫描范围
Eclipse可能会自动识别并添加跨项目的包扫描,但Gradle命令行下Spring Boot只会默认扫描主启动类所在包及其子包。如果兄弟项目的服务不在这个范围内,需要在@SpringBootTest或主启动类里指定扫描路径:@SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, scanBasePackages = {"com.your.sibling.service.package", "com.your.boot.app.package"} )或者在主启动类上添加
@ComponentScan(basePackages = {"..."})来覆盖默认扫描范围。确认依赖声明的正确性
检查Spring Boot子项目的依赖声明,确保兄弟项目是用implementation project(':sibling-project')而不是testImplementation——因为集成测试属于主测试代码,需要依赖兄弟项目的主代码,而非测试代码。
优先试试前两个方案,这是Gradle+Spring Boot多项目测试最常见的问题根源。Eclipse的类路径处理比较宽松,会自动整合跨项目的编译输出,但Gradle命令行严格遵循构建脚本的配置,所以容易出现这种差异。
内容的提问来源于stack exchange,提问作者Archange

