如何在Gradle 4.7中设置Spring Boot的活动配置文件

11

总体:
我正在尝试为特定的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

问题:
有没有办法像对于bootRun任务一样,将活动配置文件传递给gradle(v 4.7)build任务?

bootRun {
        bootRun.systemProperty 'spring.profiles.active', 'development'
}

注意: 我尝试了相同的构建方法,但是对于构建任务,build.systemProperty 方法不存在。

作为一名新手,我很感激如果您能与我分享您真正的解决方案。

4个回答

16
你需要做的是在运行单元测试的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

1
谢谢您的回复。不过,我正在寻找如何在构建(build)而非 bootRun 中实现相同的功能。在 bootRun 中一切正常,但我不知道如何在“build”任务中实现相同的功能。 - saeedj
如何表达配置文件是默认的,例如 application.properties - Zon

5
如果你使用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进行构建。


为什么你不试着在运行时添加参数 'spring.profiles.active=dev' 呢?请确保你有相应的属性文件。 - Rahul Anand

5

Gradle文件不应该依赖于您的Spring配置文件,除非您明确希望这样做。

要使用特定的配置文件运行应用程序,请使用:

SPRING_PROFILES_ACTIVE=myprofile ./gradlew bootRun

1

in build.gradle:

task 'testCi' (type: Test) {
    useJUnit()
    jvmArgs "-Dspring.profiles.active=ci"
}

task 'testLocal' (type: Test) {
    useJUnit()
    jvmArgs "-Dspring.profiles.active=local"
}

我刚刚被Gradle 6.x的处理方式所困扰, 我有两个单独的测试任务,我想使用本地或CI配置运行相同的测试。

测试使用Junit平台,对于此平台,Gradle会生成一个新的JVM。据我所知,systemProperties不会传递到运行测试的JVM中,但jvmArgs将特定地将属性传递给测试JVM。

正如Eugene建议的那样,使用环境变量也可以工作,因为子JVM通常从其父进程继承环境。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接