在Gradle项目中,我正在尝试在build.gradle
中生成战争之前更改属性文件值,如下所示,
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
时,它都会在以前的日期生成战争。说,我是在11:30
上首次构建,并在11:34
上进行第二版。第二次建造的战争包含时间为11:30
而不是11:34
。我的目的是在建立战争时更新日期。是正确的吗?
我简化了您的解决方案并对其进行了测试。对我来说,当我运行build
或仅war
时,它总是会更新属性文件中的日期。请注意,我改变了测试目的的路径。这是代码:
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
是不包含在当前战争中的,因为您正在打包的战争资源已在您执行战争。
如果要在战争档案中包含带有当前构建时间的agation.properties文件,则应创建一个自定义任务以更新属性文件并将任务连接到buildchain,然后再处理资源。。我为您创建了一个示例任务:
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