Gradle用WAR插件替换资源文件

Ert*_* D. 4 resources war gradle

我正在尝试使用Gradle替换WAR插件任务中的资源文件.

基本上我有两个资源文件:

database.properties
database.properties.production
Run Code Online (Sandbox Code Playgroud)

我想实现的是替代"database.properties""database.properties.production"下最终WAR文件WEB-INF/classes中.

我尝试了很多东西,但对我来说最符合逻辑的是以下哪些不起作用:

    war {
        webInf {
            from ('src/main/resources') {
                exclude 'database.properties'
                rename('database.properties.production', 'database.properties')
                into 'classes'
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是这会导致所有其他资源文件重复,包括重复的database.properties(具有相同名称的两个不同文件),并且数据库中仍然存在database.properties.production.

我需要一个没有重复的干净解决方案,而且WAR中没有database.properties.production.

Pet*_*ser 6

如果您无法在运行时做出决定(这是处理特定于环境的配置的推荐最佳实践),eachFile那么您可能是最好的选择:

war {
    rootSpec.eachFile { details -> 
        if (details.name == "database.properties") {
            details.exclude()
        } else if (details.name == "database.properties.production") {
            details.name = "database.properties"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:Gradle 1.7添加filesMatching(pattern) { ... },可能表现更好eachFile.