Разверните дополнительные файлы в Gradle Application Plugin - PullRequest
29 голосов
/ 21 апреля 2011

У меня небольшой проект Java / Gradle.Я использую плагин Application для создания zip-дистрибутива (с помощью задачи distZip).Используя стандартную конфигурацию, я получаю следующие каталоги в моем zip-файле:

/ bin - здесь находятся скрипты для запуска приложения. / lib - содержит код моего проекта в файле JAR и все файлы JAR зависимостей.

Проблема в том, что мне нужен третий каталог: / conf , где ямогу поместить мои файлы конфигурации (вместо того, чтобы упаковывать их в JAR-файл моего приложения.

Я предполагаю, что это довольно распространенное требование, потому что такие вещи, как log4j.xml и hibernate.properties лучше размещать вне файла JARЯ просто не могу понять, как я могу настроить поведение плагина приложения, чтобы сделать это, однако.

Ответы [ 5 ]

31 голосов
/ 14 июня 2011

Я вернулся к этой проблеме несколько месяцев спустя, и, наконец, у меня есть элегантное решение. В файл Gradle должен быть добавлен следующий код:

distZip {
    into(project.name) {
        from '.'
        include 'conf/*'
    }
}

Это добавляет дополнительное включение в задачу distZip. Это копирует каталог "conf" (включая содержимое) в дистрибутив Zip.

Созданный zip-файл содержит один каталог, который совпадает с именем проекта. Вот почему требуется "в" часть.

27 голосов
/ 24 февраля 2012

На самом деле, создайте каталог dist в каталоге src в вашем проекте. Все, что в этом каталоге, копируется плагином приложения (под applicationDistribution) при запуске installApp или distZip.

Или отредактируйте applicationDistribution, чтобы выполнить другие действия, если простой копии недостаточно.

14 голосов
/ 31 марта 2014

Для меня простой

applicationDistribution.from("src/main/config/") {
    into "config"
}

сделал работу. Конечно, вам нужно правильно загружать свои свойства из кода. Особенно, если вы переместите их из src / main / resources, где их можно было использовать через classpath, в новое место. Я обошел это, добавив параметр командной строки, который указывает на файл конфигурации.

7 голосов
/ 22 апреля 2011

Я не уверен, можете ли вы настроить плагин приложения, я никогда не использовал его.Однако есть и другие способы достичь того, чего вы хотите достичь.

Вы можете создать каталог /conf следующим образом:

confDir = new File("$buildDir/conf")

Затем вы можете скопировать нужные файлы в этот каталог следующим образом:

task copyConfFiles(type: Copy) {
   from _wherever your files reside_
   into confDir
   include('**/*.properties') // your configuration files 
}

Youможет затем подключить эту задачу копирования к процессу следующим образом:

distZip.dependsOn copyConfFiles

И, наконец, если вы не хотите, чтобы ваши конфигурации были в последнем zip-файле, вы можете сделать это:Там может быть лучший способ.Это a способ.

0 голосов
/ 18 декабря 2017

Самостоятельный ответ OP может быть полезен для его случая использования, но есть несколько вещей, которые я хотел бы улучшить:

  1. Его ответ предполагает, что у него есть каталог conf, параллельный build.gradle. В Maven Стандартная структура каталогов такого нет. Общий консенсус заключается в том, чтобы иметь src/main/conf, как было указано в документах:

Если для сборки артефакта есть другие источники, они будет в других подкаталогах: например, src / main / antlr будет содержит файлы определения грамматики Antlr.

  1. Имя целевого каталога НЕ project.name, как было указано в комментарии.

  2. Если требуется фильтрация ресурсов, и это часто бывает, то желательно иметь отдельную задачу. Во время локальной разработки эту задачу можно запустить для создания отфильтрованных файлов. Распределение будет просто использовать выходные данные этой задачи (и в отличие от ответа OP, это также делает conf доступным для распределения tar).

    def props = new Properties()
    file("src/main/filters/application.properties")
        .withInputStream { props.load(it) }
    
    import org.apache.tools.ant.filters.ReplaceTokens
    
    task copyConf(type: Copy) {
        from("src/main/conf/")
        into("$buildDir/conf")
        filesMatching("**/*.y*ml") {
            filter(tokens: props, ReplaceTokens)
        }
    }
    distributions {
        main {
            contents {
                from(copyConf) {
                    into("conf")
                }
            }
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...