[英]How to set annotation attribute value based on the active profile in Spring Boot?
[英]How to set spring boot active profile in Gradle 4.7
总体:
我正在尝试为特定的 spring 配置文件运行 gradle 构建任务,但在通过以下测试时出错:
au.com.mnpd.security.JwtTokenUtilTest > generateToken_succeeds FAILED
java.lang.IllegalStateException
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
Caused by: org.springframework.beans.factory.BeanCreationException
Caused by: java.lang.IllegalArgumentException
该测试使用了 spring开发配置文件中的一些属性(位于 application-development.yaml 中)。 但是我找不到任何方法将活动配置文件传递给 gradle build 命令。 我尝试了以下但同样的问题:
- gradlew -Dspring.profiles.active=development build
- gradlew -Pdevelopment build
题:
无论如何将活动配置文件传递给 gradle (v 4.7)构建任务,例如适用于bootRun任务的内容,如下所示:
bootRun {
bootRun.systemProperty 'spring.profiles.active', 'development'
}
注意:我为构建尝试了相同的方法,但构建任务不存在build.systemProperty方法。
由于我是 gradle 新手,如果您能与我分享您的真正解决方案,我将不胜感激。
您正在寻找的是在Test
任务上设置系统属性,这将运行您的单元测试:
test {
systemProperty 'spring.profiles.active', 'development'
}
评论后编辑 - 将原始答案留在下面,因为它可能仍然有用。
Gradle 不知道bootRun
公开其系统属性的方式。
因此,您必须在构建脚本中添加配置,以向 Gradle 命令行公开您需要的内容。
就像是:
bootRun {
bootRun.systemProperty 'spring.profiles.active', "${springProfile}"
}
然后在gradle.properties
有一个默认值:
springProfile = development
并可能覆盖命令行上的值:
./gradlew -PspringProfile=test build
如果你使用 gradle boot run 你需要把它添加到你的 build.gradle 文件中
bootRun {
String activeProfile = System.properties['spring.profiles.active']
systemProperty "spring.profiles.active", activeProfile
}
然后在构建时您可以使用 gradle bootRun -Dspring.profiles.active=test
或者构建你可以使用 gradle build -Dspring.profiles.active=test
Gradle 文件不应依赖于您的 spring 配置文件,除非您明确希望这样做。
要使用特定配置文件运行您的应用程序,请使用:
SPRING_PROFILES_ACTIVE=myprofile ./gradlew bootRun
在 build.gradle 中:
task 'testCi' (type: Test) {
useJUnit()
jvmArgs "-Dspring.profiles.active=ci"
}
task 'testLocal' (type: Test) {
useJUnit()
jvmArgs "-Dspring.profiles.active=local"
}
我刚刚被 Gradle 使用 Gradle 6.x 处理这个问题的方式所困扰,我有两个单独的测试任务,我想在其中使用本地或 CI 配置运行相同的测试。
测试使用 Junit 平台,Gradle 为其生成了一个新的 JVM。 据我所知,systemProperties 不会传递给 JVM 运行测试,但 jvmArgs 会专门将属性传递给测试 JVM。
使用 Eugene 建议的 env vars 也可以工作,因为子 JVM 通常从其父级继承 env。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.