使用Gradle将环境属性复制到WAR中并动态更新版本属性

时间:2015-03-25 02:17:59

标签: gradle war

我有一个gradle构建,可以创建多个war文件,一个用于config目录中定义的每个环境。例如,如下的目录结构将产生3次战争:

cfg
- dev
   - application.properties
   - log4j.properties
- staging
   - application.properties
   - log4j.properties
- production
   - application.properties
   - log4j.properties

应用程序的版本位于gradle文件中,也位于密钥application.properties下的app.version文件中。我想仅在build.gradle中维护该版本,并在构建时将值复制到application.properties文件中。

我的gradle脚本创建并执行构建的部分如下。我已经尝试了一些方法,包括ant.replace任务来复制版本(包含在脚本中),但我似乎无法找到对application.properties文件的正确文件引用这个工作。我也很高兴接受任何其他方法来建立战争。

// generate package* tasks for all defined configurations
files { file('cfg').listFiles() }.each { 
    File file -> if (file.name != 'common' && file.name != '.svn') {
        tasks.create(name: "package$file.name", type: War, dependsOn: classes) {
            classifier = file.name
            from("./cfg/$file.name") {
                into("WEB-INF/classes")
                include "**/*"
            }
            ant.replace(file:"WEB-INF/classes/application.properties", token:"@appVersion", value:project.version)
        }
    }
}

// run all assemble tasks
task dist (dependsOn: tasks.matching { Task task -> task.name.startsWith("package") }) 

1 个答案:

答案 0 :(得分:0)

可以简化一下:

apply plugin: 'war'

import org.apache.tools.ant.filters.ReplaceTokens

project.file('cfg').listFiles().each { File file ->
   if (file.name != 'common' && file.name != '.svn') {
      tasks.create(name: "package$file.name", type: War, dependsOn: classes) {
         classifier = file.name
         from(file) {
            into('WEB-INF/classes')
            include "**/*"            
            filter(ReplaceTokens, tokens: ['app.version': '2.3.1'])
         }
      }
   }
}

task dist (dependsOn: tasks.matching { Task task -> task.name.startsWith("package") })

完整演示here,同时查看docs