Znalazłem rozwiązanie, które działa dobrze dla mnie. Kluczem jest to, że ty dodać oddzielny podprojekt do tworzenia dist. Ten podprojekt to sibling do pozostałych podprojektów. Oznacza to, że nie próbuj skryptować dystrybucji w pliku najwyższego poziomu build.gradle
.
Nazwijmy nowy podprojekt dist
. Pierwszą rzeczą, którą należy zrobić, to dodać je do najwyższego poziomu settings.gradle
plik w katalogu głównym wieloma projektami:
include "subproject1", "subproject2", "subproject3", ....... , "dist"
Twój projekt dist
musi co najmniej zawierać:
build.gradle
- należy szczegółowo poniżej
src/main/dist/at_least_one_dummy_file.txt
- Wtyczka dystrybucyjna zawsze wymaga katalogu src/main/$distribution.name
. Posiadanie niepustego z distribution.name
z main
sztuczki wtyczki do śledzenia wszystkich przechodnich zależności wszystkich zestawów źródłowych wszystkich projektów siostrzanych.
Następny plik build.gradle
dla projektu 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"
. . .
}
}
}
Następnie uruchom gradle distZip
. Plik ZIP
w wersji dist/build/distributions
będzie miał podkatalog lib
z każdym pojedynczym JAR
, którego potrzebujesz: projektem siostrzanym JAR
s oraz ich przejściowymi zależnościami.
Z powodu oszustwa, którego użyliśmy, wtyczka dystrybucji zrobi pustą JAR
o nazwie dist-${version}.jar
. Ze względów kosmetycznych usuwam go za pomocą połączenia exclude
powyżej, ale jest on nieszkodliwy. Możesz również użyć drugiego połączenia exclude
, aby usunąć at_least_one_dummy_file.txt
, jeśli naprawdę nie ma treści pod numerem src/main/dist
, którą chcesz dołączyć. Jeśli nie chcesz dodawać żadnych artefaktów i/lub usuwać wymienionych tutaj, to w ogóle nie potrzebujesz sekcji contents
.
Znalazłem także sposoby selektywnego włączania różnych artefaktów w zależności od tego, czy jest to dystrybucja "dev" czy "prod", a la Maven. Jeśli chcesz, żebym to dodał, opublikuj w komentarzach, a ja to zrobię.
Nie mogłem wykonać tej pracy z Gradle 3.3. –