Скопируйте свойства среды в WAR с помощью Gradle и динамически обновите свойство версии.

У меня есть сборка gradle, которая создает несколько файлов войны, по одному для каждой среды, определенной в каталоге конфигурации. Например, следующая структура каталогов приведет к 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") }) 

person Luke    schedule 25.03.2015    source источник


Ответы (1)


Можно немного упростить:

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") })

Полная демонстрация здесь, взгляните на docs.

person Opal    schedule 25.03.2015
comment
Дополнительный вопрос: как мне динамически ссылаться на свойство version сборки войны вместо '2.3.1'? - person Luke; 26.03.2015
comment
Я должен уточнить, что когда это находится в том же файле, что и объявление версии, оно работает правильно, однако я пытаюсь определить вышеизложенное во внешнем файле, который включен в локальный файл сборки, который просто определяет зависимости и версию. - person Luke; 26.03.2015
comment
@ Люк, только что обновил ответ на github, пожалуйста, взгляни на него. Вы можете передать его через системное свойство, например. - person Opal; 26.03.2015
comment
Спасибо Опал. Мне удалось заставить его работать так же, как вы, имея все функции в одном файле сборки. Я пытался иметь общую функцию сборки в отдельном файле, а затем иметь зависимости проекта, версию, группу и т. д. в файле сборки проекта (который импортирует общий). Когда я делаю это таким образом, версия всегда появляется неопределенной, поэтому я просто использовал один файл сборки. Спасибо за вашу помощь! - person Luke; 30.03.2015