【问题标题】:How to set spring boot active profile in Gradle 4.7如何在 Gradle 4.7 中设置 Spring Boot 活动配置文件
【发布时间】:2018-11-12 21:48:30
【问题描述】:

总体:
我正在尝试为特定的 spring 配置文件运行 gradle build 任务,但在通过以下测试时出错:

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 development 配置文件中的一些属性(位于 application-development.yaml 中)。但我找不到任何方法将活动配置文件传递给 gradle build 命令。 我尝试了以下但同样的问题:

- gradlew -Dspring.profiles.active=development build

- gradlew -Pdevelopment build

问题:
是否有将活动配置文件传递给 gradle (v 4.7) build 任务,例如适用于 bootRun 任务的任务,如下所示:

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

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

由于我是 gradle 新手,如果您能与我分享您真正的解决方案,我将不胜感激。

【问题讨论】:

    标签: java spring-boot gradle profile


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      SPRING_PROFILES_ACTIVE=myprofile ./gradlew bootRun
      

      【讨论】:

        【解决方案3】:

        如果你使用 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”。确保你有相应的属性文件可用
        【解决方案4】:

        您正在寻找的是在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
        

        【讨论】:

        • 感谢您的回复。但是,我正在寻找为构建而不是 bootRun 做同样的事情。 bootRun 中一切正常,但我不知道如何为“构建”任务做同样的事情。
        • 如何说配置文件是默认的,例如application.properties?
        猜你喜欢
        • 2016-10-08
        • 1970-01-01
        • 2017-01-25
        • 2015-09-11
        • 2021-07-17
        • 2022-08-16
        • 1970-01-01
        • 2020-12-23
        相关资源
        最近更新 更多