Подтвердить что ты не робот

Разверните дополнительные файлы в Gradle Плагин приложений

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

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

distZip.dependsOn copyConfFiles

И последнее, если вам не нужны ваши настройки в последнем zip файле, вы можете сделать это:

distZip {
   exclude('**/*.properties') // your configuration files
}

Опять же, может быть, лучший способ. Это путь.

Ответ 5

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

  • Его ответ предполагает, что у него есть каталог conf, параллельный build.gradle. В Maven Standard Directory Layout нет такой вещи. Общий консенсус заключается в том, чтобы иметь 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")
                }
            }
        }
    }