Я нашел решение, которое хорошо работает для меня. Суть в том, что вы добавляете отдельный подпроект для создания дистрибутива. Этот подпроект является родственным по отношению к другим подпроектам. То есть не пытайтесь заскриптовать дистрибутив в файле build.gradle
верхнего уровня.
Назовем новый подпроект dist
. Первое, что нужно сделать, это добавить его в файл settings.gradle
верхнего уровня в корневом каталоге вашего мультипроекта:
include "subproject1", "subproject2", "subproject3", ....... , "dist"
Ваш dist
проект должен как минимум включать:
build.gradle
- подробнее ниже
src/main/dist/at_least_one_dummy_file.txt
— для плагина дистрибутива всегда требуется каталог src/main/$distribution.name
. Наличие непустого файла с distribution.name
из main
заставляет плагин следовать всем транзитивным зависимостям всех main
наборов исходников всех родственных проектов.
Далее файл build.gradle
для проекта dist
:
/* Hook in all sibling project jars and their transitive dependencies */
apply plugin: 'java'
dependencies {
compile project(':subproject1')
compile project(':subproject2')
compile project(':subproject3')
. . .
}
/* Distribution */
apply plugin: 'java-library-distribution'
distributions {
main {
baseName = "your-top-level-project-name"
contents {
exclude "dist-${version}.jar"
. . .
}
}
}
Затем запустите gradle distZip
. Файл ZIP
в dist/build/distributions
будет иметь подкаталог lib
с каждым JAR
, который вы хотите: родственный проект JAR
s и их транзитивные зависимости.
Из-за обмана, который мы использовали, плагин дистрибутива создаст пустой файл JAR
с именем dist-${version}.jar
. Из косметических соображений я удаляю его вызовом exclude
выше, но это безвредно. Вы также можете использовать второй вызов exclude
для удаления at_least_one_dummy_file.txt
, если действительно нет содержимого под src/main/dist
, которое вы хотите включить. Если вы не хотите добавлять какие-либо артефакты и/или удалять упомянутые здесь, то вам вообще не нужен раздел contents
.
Я также нашел способы выборочного включения различных артефактов в зависимости от того, является ли это дистрибутивом «dev» или «prod», а-ля профили Maven. Если вы хотите, чтобы я добавил это, пожалуйста, напишите в комментариях, и я это сделаю.
person
sparc_spread
schedule
16.05.2014