Gradle doFirst不更新WAR文件

时间:2018-02-14 07:50:07

标签: gradle build.gradle

在gradle项目中,我试图在build.gradle中生成WAR之前更改属性文件值,如下所示,

war {
    doFirst {
        def propertyFile = file "src/main/resources/properties/about/About.properties"
        def props = new Properties()
        propertyFile.withReader { props.load(it) }
        props.setProperty('releaseDate', new Date().format("yyyy-MM-dd HH:mm:ss"))
        propertyFile.withWriter { props.store(it, null) }
    } 
    rootSpec.exclude("**/test.jar")
}

但每当我给build时,它会生成具有前一个日期时间的WAR。说,我在11:30进行首次构建,在11:34进行第二次构建。第二个构建的WAR包含11:30而不是11:34的时间。我的目的是在构建WAR时更新日期。这样对吗?

1 个答案:

答案 0 :(得分:0)

我简化了您的解决方案并进行了测试。对我来说,当我运行buildwar时,它始终会更新属性文件中的日期。请注意,我为测试目的更改了路径。这是代码:

war {
    doFirst {
        File propsFile = file "src/main/resources/about.properties"

        Properties props = new Properties()
        props.load(propsFile.newDataInputStream())
        props.setProperty('releaseDate', new Date().format('yyyy-MM-dd HH:mm:ss'))
        props.store(propsFile.newWriter(), null)
    }
}

请注意,由于您正在处理的战争资源已被处理,因此当前战争中包含的about.properties的releaseDate 之前你执行战争。

如果要将包含当前构建时间的about.properties文件包含到war存档中,则应创建自定义任务以更新属性文件,并在处理资源之前将任务挂钩到构建链中的某个点。我为你创建了一个示例任务:

task updateReleaseDate {
    doLast {
        File propsFile = file "src/main/resources/about.properties"

        Properties props = new Properties()
        props.load(propsFile.newDataInputStream())
        props.setProperty('releaseDate', new Date().format('yyyy-MM-dd HH:mm:ss'))
        props.store(propsFile.newWriter(), null)
    }
}

processResources.dependsOn updateReleaseDate

如果没有自定义任务,您的构建链就像这样。在processResources任务处理资源之后更新属性,因此当前战争中包含compileJava->processResources->classes->war

使用自定义任务,您的构建链看起来像这样。在processResources任务处理资源之前更新属性,因此在当前战争中包含compileJava->updateReleaseDate->processResources->classes->war