Gradle用WAR插件替换资源文件

时间:2013-07-25 12:58:04

标签: resources gradle war

我正在尝试使用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。

2 个答案:

答案 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)
    }
}