Gradle bootRun设置SPRING_PROFILES_ACTIVE不生效问题
- 操作系统:MacOS Monterey
- 框架版本:Spring Boot 2.4.5
- 构建工具版本:Gradle 7.4.2
直接在命令行前缀设置SPRING_PROFILES_ACTIVE=local执行./gradlew bootRun时,该环境变量只会注入Gradle自身运行的构建JVM进程。Spring Boot的bootRun任务默认会fork出一个完全独立的全新JVM进程运行业务应用,这个新启动的应用进程默认不会自动继承Gradle构建进程里的自定义环境变量,最终Spring应用读不到SPRING_PROFILES_ACTIVE对应的变量值,profile配置自然不生效。
之前使用的./gradlew bootRun --args='--spring.profiles.active=local'能正常生效,是因为--args是bootRun任务专门提供的参数透传入口,传入的内容会直接作为应用进程的启动命令行参数传给Spring上下文,Spring可以直接识别到spring.profiles.active配置,因此运行符合预期。
需要明确:Spring Boot本身原生支持读取SPRING_PROFILES_ACTIVE环境变量激活profile,问题根源是Gradle的进程隔离机制没有把这个变量传到应用进程,不是Spring不识别环境变量配置。
根据使用场景选择对应方案即可:
- 零配置临时启动:直接使用已验证可用的args传参方式,无需修改任何构建配置,适合本地临时调试切换profile:
./gradlew bootRun --args='--spring.profiles.active=local' - 支持环境变量传参的永久配置:在项目构建脚本中配置bootRun任务,主动将Gradle进程读取到的
SPRING_PROFILES_ACTIVE环境变量透传给应用进程。
若使用Groovy DSL(对应build.gradle配置文件),添加如下内容:
若使用Kotlin DSL(对应bootRun { environment "SPRING_PROFILES_ACTIVE", System.getenv("SPRING_PROFILES_ACTIVE") }build.gradle.kts配置文件),添加如下内容:
配置完成后,执行tasks.bootRun { environment("SPRING_PROFILES_ACTIVE", System.getenv("SPRING_PROFILES_ACTIVE")) }SPRING_PROFILES_ACTIVE=local ./gradlew bootRun即可正常激活local profile。 - 系统属性传参方式:如果不想修改构建脚本,也可以通过bootRun的JVM参数入口传入Spring profile系统属性,执行命令如下:
注意该方式需要确保bootRun任务没有自定义jvmArgs覆盖默认的系统属性透传逻辑,Spring Boot 2.4.x版本的默认bootRun配置原生支持该传参方式。./gradlew bootRun -Dspring.profiles.active=local
避坑提示:不要将
SPRING_PROFILES_ACTIVE配置在Gradle的org.gradle.jvmargs参数中,该参数仅对Gradle构建进程本身生效,配置后不会传递给fork出的应用进程,无法达到激活profile的效果。
内容的提问来源于stack exchange,提问作者Lesha Pipiev

