如何在Gradle 4.7中设置弹簧启动活动配置文件

时间:2018-06-03 11:01:51

标签: java spring-boot gradle profile

总体
我试图为特定的弹簧配置文件运行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的新人,我很感激你能和我分享你真正的解决方案。

4 个答案:

答案 0 :(得分:3)

您正在寻找的是在ObjectTest max = lst.stream() .max(Comparator.comparingInt(obj->operation(obj.getA(), obj.getB()))) .orElse(null); 任务上设置系统属性,这将运行您的单元测试:

Test

在评论后编辑 - 将原始答案留在下面,因为它可能仍然有用。

Gradle不知道test { systemProperty 'spring.profiles.active', 'development' } 公开其系统属性的方式。

因此,您必须在构建脚本中添加配置,以向Gradle命令行公开所需的内容。

类似的东西:

bootRun

然后在bootRun { bootRun.systemProperty 'spring.profiles.active', "${springProfile}" } 中有默认值:

gradle.properties

并可能覆盖命令行上的值:

springProfile = development

答案 1 :(得分:3)

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

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

SPRING_PROFILES_ACTIVE=myprofile ./gradlew bootRun

答案 2 :(得分:2)

如果您使用gradle boot运行,则需要将其添加到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

答案 3 :(得分:0)

在 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。