Разверните дополнительные файлы в Gradle Плагин приложений
У меня есть небольшой проект Java/ Gradle. Я использую Плагин приложений для создания zip-дистрибутива (с использованием задачи distZip). Используя стандартную конфигурацию, я получаю следующие каталоги в моем zip файле:
/bin - скрипты для запуска приложения здесь
/lib - Содержит код проекта в файле JAR и всех JAR файлах зависимости.
Проблема в том, что мне нужен третий каталог: /conf, где я могу поместить свои файлы конфигурации (вместо того, чтобы их упаковывать в файл JAR приложения.
Я предполагаю, что это довольно распространенное требование, потому что такие вещи, как log4j.xml и hibernate.properties, будут лучше размещены вне JAR файла. Я просто не могу понять, как я могу настроить поведение плагина приложения для этого.
Ответы
Ответ 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.
-
Имя целевого каталога НЕ project.name
, как было указано в комментарии.
-
Если требуется фильтрация ресурсов, и это часто бывает, то желательно иметь отдельную задачу. Во время локального развития эту задачу можно выполнить для создания фильтрованных файлов. Распределение будет просто использовать результат этой задачи (и в отличие от ответа 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")
}
}
}
}