【问题标题】:Setting Values from application.properties When Building构建时从 application.properties 设置值
【发布时间】:2021-02-16 02:43:28
【问题描述】:

我发现我可以在使用bootRun 运行应用程序时设置属性,但我想在构建它时设置属性。

假设我在 application.properties 中有一个变量,我想在构建时间设置它的值。

application.properties:

spring.datasource.url=${db}

如果我在build.gradle 中设置bootRun { systemProperties = System.properties },我可以使用./gradlew bootRun -Ddb=foo 将值传递给application.properties

是否可以在构建时执行此操作?我基本上把bootRunbootRun { systemProperties = System.properties }改成了build,但是报错了:

无法为 org.gradle.api.DefaultTask 类型的任务...设置未知属性“systemProperties”

如何在构建时将值传递给application.properties

我们希望在构建时传递它们的原因是我们可能会重新启动项目几次,而我们可以构建一次。我们不想在每次重新启动项目时都设置它们。这就是为什么我们要设置它们的构建时间。

【问题讨论】:

  • 你可以使用弹簧型材!
  • @AbdelghaniRoussi,是的,但我们不想在服务器上保留 dev、qa 等的任何环境文件。这就是我们愿意在构建时传递变量的原因。

标签: spring-boot gradle build.gradle


【解决方案1】:

一个本土解决方案的工作示例here(如果我理解这个问题)。

考虑一个模板文件,例如src/main/resources/template.application.properties

server.port=__SERVER_PORT
spring.datasource.url=__SPRING_DATASOURCE_URL 

然后执行令牌替换,作为build 任务的一部分,以生成src/main/resources/application.properties

build.doFirst {
    def appPropsFilename = "${projectDir}/src/main/resources/application.properties"
    ant.delete(file: appPropsFilename)
    def appProps = new File(appPropsFilename)
    def templateAppProps = new File("${projectDir}/src/main/resources/template.application.properties")

    appProps.withWriter { def writer ->
        templateAppProps.eachLine { def line ->
            def newLine = line.replace("__SERVER_PORT", "6161") 
                              .replace("__SPRING_DATASOURCE_URL", "http://example.com/db")
            writer.write(newLine + "\n");
        }
    }
}

请注意,标记只是示例。它们可以随心所欲地命名,并且值可以来自任何方便您需要的地方。

另请注意:您需要针对您的用例进行彻底测试。现在,它取决于build 任务的执行。 (将替换代码放在自己的任务中可能会更好。)

【讨论】:

  • 谢谢,迈克尔。这就是我一直在寻找的,但是否可以完全不删除application.properties?在本地工作时可能会导致问题。是否可以只更改这两个值而不删除文件?
猜你喜欢
  • 2019-04-08
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
相关资源
最近更新 更多