繁体   English   中英

如何在 Gradle 4.7 中设置 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM