在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时更新日期。这样对吗?
最佳答案
我简化了您的解决方案并进行了测试。对我来说,当我运行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
是,而不是您当前正在构建的当前 war 中的,因为您要打包的 war 的资源已在执行 war 之前被处理为。如果要在当前构建的时间中将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任务处理资源后更新属性,因此当前 war 中不包括而不是:
compileJava->processResources->classes->war
使用自定义任务,您的构建链如下所示。在之前更新属性,资源由processResources任务处理,因此在当前 war 中包括:
compileJava->updateReleaseDate->processResources->classes->war
关于gradle - Gradle doFirst不更新WAR文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48782125/