2013-07-25 3 views
4

Я пытаюсь заменить файл ресурсов в моей плагине WAR с помощью Gradle.Gradle заменит файл ресурсов плагином WAR

В принципе у меня есть два ресурса файла:

database.properties 
database.properties.production 

То, что я хочу добиться, это заменить 'database.properties' с 'database.properties.production' в конечном файле WAR под WEB -INF/классы.

Я пробовал много вещей, но наиболее логичным для меня было следующее, которое не работает:

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 в WAR.

ответ

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.

+0

Только что попробовал, и это не работает. Похоже, это не имеет никакого эффекта. : S –

+0

Я обновил код и подтвердил, что он работает. В двух словах, изменяя существующую конфигурацию (в этом случае конфигурация, выполненная плагином 'war'), которая не соответствует вашим потребностям, может быть сложной. Иногда лучше решать проблему по-разному. В этом случае одной альтернативой может быть удаление «неправильного» файла (и переименование другого) в 'processResources.doLast' {...}. Или вы можете помещать файлы где-то, кроме 'src/main/resources', и включать их вручную по мере необходимости (' war.webInf.from ... '). Какое решение лучше всего зависит от ваших конкретных потребностей (интеграция IDE и т. Д.). –

+0

Это сработало. Благодарю. Причина, по которой я выбираю этот метод, заключается в том, что он требует минимальной работы. Я не хочу сохранять свойства в отдельном месте. С помощью этого метода, когда я работаю с моей IDE, мой код видит тестовую базу данных в database.properties, и когда я создаю свою WAR, я знаю, что настраиваю производственную базу данных. –

1

Если вы хотите решение, которое работает для нескольких задач архивации, вы можете изменить файлы свойств в «build/resources/main» после выполнения задачи processResources. Я не уверен, что это общепринятая практика. Я работаю с двумя задачами архива, 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) 
    } 
}