我找到了一个对我来说效果很好的解决方案。关键是您添加一个单独的子项目来创建 dist。该子项目是其他子项目的兄弟项目。也就是说,不要尝试在顶级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拥有一个带有 a的非空 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及其传递依赖项。
由于我们使用的诡计,分发插件将创建一个空的JAR名为dist-${version}.jar. 出于美观的原因,我通过exclude上面的调用将其删除,但它是无害的。如果确实没有要包含的内容,您还可以使用第二次exclude调用来删除。如果您不想添加任何工件和/或删除此处提到的工件,那么您甚至根本不需要一个部分。at_least_one_dummy_file.txtsrc/main/distcontents
我还找到了根据这是“开发”还是“产品”发行版(例如 Maven 配置文件)有选择地包含不同工件的方法。如果你想让我补充,请在评论中发表,我会的。