Gradle测试中Spring Docker Compose Support不生效,如何免打包解决?
Spring Docker Compose Support随Spring Boot 3.1推出,配置后执行./gradlew bootRun时能正常启停Docker服务。按照官方文档,使用developmentOnly依赖声明可避免将其打包到生产构建中:
dependencies { developmentOnly("org.springframework.boot:spring-boot-docker-compose") }
运行@SpringBootTest测试时,因Docker服务未启动导致Bean创建失败——这符合官方文档中「测试时默认禁用该支持」的说明。但设置spring.docker.compose.skip.in-tests=false后,问题依旧,完全看不到Docker Compose Support加载的迹象。将developmentOnly改为implementation后,测试才恢复正常。
这说明developmentOnly依赖无法在测试运行时生效,可能是配置遗漏,或是Spring Gradle文档/实现存在问题。当前需要解决的核心需求是:如何在Gradle中实现测试时启用Docker Compose Support,同时避免该可选依赖被无意打包?
相关未解决问题:
- Spring Boot 3.1 RC1 Docker Compose无法在集成测试中激活
- Spring Boot 3.1搭配Compose和Postgres依赖时,contextLoad测试失败
解决方案
方法1:同时声明developmentOnly和testImplementation依赖
将依赖拆分为两项,既保证开发运行时可用,又让测试阶段能加载到该依赖:
dependencies { developmentOnly("org.springframework.boot:spring-boot-docker-compose") testImplementation("org.springframework.boot:spring-boot-docker-compose") }
developmentOnly确保依赖不会被打包到生产构建,testImplementation则让测试阶段能正常加载Docker Compose Support,配合spring.docker.compose.skip.in-tests=false即可启动Docker服务。
方法2:用Gradle配置规则统一管理
若不想重复声明依赖,可通过Gradle配置规则让testImplementation继承developmentOnly的依赖:
configurations { testImplementation.extendsFrom developmentOnly } dependencies { developmentOnly("org.springframework.boot:spring-boot-docker-compose") }
这种方式更简洁,一次声明即可覆盖开发运行和测试场景,同时依然保证依赖不会被打包到生产构件中。
注意事项
- 确保测试配置中
spring.docker.compose.skip.in-tests=false已正确设置(可在src/test/resources/application.properties或application.yml中配置) - 检查Gradle版本与Spring Boot 3.1的兼容性,建议使用Gradle 7.5及以上版本
内容的提问来源于stack exchange,提问作者oligofren

