我正在尝试使用Gradle替换WAR插件任务中的资源文件。
基本上我有两个资源文件:
database.properties
database.properties.production
我想要实现的是在 WEB-INF /下的最终WAR文件中用'database.properties.production'替换'database.properties'类
我尝试了很多东西,但对我来说最符合逻辑的是以下哪些不起作用:
war {
webInf {
from ('src/main/resources') {
exclude 'database.properties'
rename('database.properties.production', 'database.properties')
into 'classes'
}
}
}
但是这会导致所有其他资源文件重复,包括重复的database.properties(具有相同名称的两个不同文件),而且数据库中仍然存在database.properties.production。
我需要一个没有重复的干净解决方案,并且在WAR中没有database.properties.production。
答案 0 :(得分:6)
如果您无法在运行时做出决定(这是处理特定于环境的配置的推荐最佳做法),eachFile
可能是您最好的选择:
war {
rootSpec.eachFile { details ->
if (details.name == "database.properties") {
details.exclude()
} else if (details.name == "database.properties.production") {
details.name = "database.properties"
}
}
}
PS:Gradle 1.7添加filesMatching(pattern) { ... }
,效果可能优于eachFile
。
答案 1 :(得分:1)
如果您想要一个适用于多个存档任务的解决方案,那么您可以在" build / resources / main"中修改属性文件。在processResources任务执行之后。我不确定这是否是一种公认的做法。我使用从build文件夹生成的两个存档任务jar和par,所以这对我有用。
此外,以下解决方案使用以" .production"结尾的所有文件。
我用Gradle 1.11测试了这个解决方案
classes << {
FileTree tree = fileTree(dir: "build/resources/main").include("*.production")
tree.each { File file ->
String origName = file.name.substring(0, file.name.length() - ".production".length())
File orig = new File(file.getParent(), origName)
orig.delete()
file.renameTo(orig)
}
}