I found a solution that has been working well for me. The key is that you add a separate subproject for creating the dist. This subproject is sibling to the other subprojects. That is, do not try to script the distribution in your top-level build.gradle
file.
Let's call the new subproject dist
. The first thing to do is to add it to your top-level settings.gradle
file in your multi-project root:
include "subproject1", "subproject2", "subproject3", ....... , "dist"
Your dist
project must at minimum include:
build.gradle
- to be detailed below
src/main/dist/at_least_one_dummy_file.txt
- the distribution plugin always requires a src/main/$distribution.name
directory. Having a non-empty one with a distribution.name
of main
tricks the plugin into following all the transitive dependencies of all the main
sourcesets of all the sibling projects.
Next, the build.gradle
file for the dist
project:
/* 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"
. . .
}
}
}
Then run gradle distZip
. The ZIP
file in dist/build/distributions
will have a lib
subdirectory with every single JAR
you want: the sibling project JAR
s and their transitive dependencies.
Because of the trickery we used, the distribution plugin will make an empty JAR
called dist-${version}.jar
. For cosmetic reasons, I remove it with the exclude
call above, but it is harmless. You could also use a second exclude
call to remove the at_least_one_dummy_file.txt
if there really is no content under src/main/dist
that you want to include. If you do not want add any artifacts and/or remove the ones mentioned here, then you don't even need a contents
section at all.
I also have found ways of selectively including different artifacts based on whether this is a "dev" or "prod" distribution, a la Maven profiles. If you want me to add that, please post in comments and I will.