如何覆盖构建目录中的Spring属性文件?

时间:2016-12-12 20:06:50

标签: gradle spring-boot

我有一个Spring Boot和Gradle项目。我在gradle可以读取它的gradle.properties文件中定义了应用程序版本。我希望在应用程序代码中包含此数字,作为@Value("${version}")注入值。

我要做的是将版本号复制到application.properties或单独的version.properties文件中(均位于src / main / resources中)。 实际上,我想将属性文件加载到Properties对象中,设置' app.verion'财产,然后写出来。理想情况下,所有这些步骤都将在build dir($ buildDir / resources / main / version.properties)中的文件上完成。这样我就不需要在VCS中存储这个dinamically set变量。不幸的是,只有在源目录中编写属性文件时才会有效。如果我尝试编辑构建中的那个,那么它没有任何效果。

你可以帮帮我吗?我的任务应该什么时候开始我觉得Spring可能会覆盖build中的文件。

我的代码是:

task appendVersionToApplicationProperties << {
    //  File versionPropsFile = new File("$buildDir/resources/main/version.properties")
    versionPropsFile.withWriter { w ->
        Properties p = new Properties()
        versionPropsFile.withInputStream {
            p.load(it)
        }
        p['app.version'] = appVersion // this is from gradle.properties
        p.store w, null
    }
}

build.finalizedBy(appendVersionToApplicationProperties)

gradle build的输出:

$ gradle clean build
:clean
:compileJava
:compileGroovy UP-TO-DATE
:processResources
:appendVersionToApplicationProperties UP-TO-DATE
:classes
:findMainClass
:war
:bootRepackage
:assemble
:compileTestJava
:compileTestGroovy UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Total time: 27.16 secs

1 个答案:

答案 0 :(得分:2)

你可以这样做:

task appendVersionToApplicationProperties {
    // write your properties
    // this is just basic groovy code
    Properties props = new Properties()
    props.put('app.version', appVersion) // get it from wherever
    def file = new File("$buildDir/resources/main/version.properties")
    file.createNewFile()
    props.store(file.newWriter(), null)
}

// this will run your task after the java compilation and resource processing
processResources.finalizedBy appendVersionToApplicationProperties