4

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

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

database.properties
database.properties.production

我想要实现的是在WEB-INF/classes下的最终 WAR 文件中将'database.properties '替换为'database.properties.production'

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

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

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

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

4

2 回答 2

7

如果您无法在运行时做出决定(这是处理特定环境配置的推荐最佳实践),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.

于 2013-07-25T13:36:59.017 回答
1

如果您想要一个适用于多个归档任务的解决方案,那么您可以在 processResources 任务执行后修改“build/resources/main”中的属性文件。我不确定这是否是一种公认​​的做法。我使用从 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)
    }
}
于 2014-09-13T01:56:02.890 回答