如何使gradle ShadowJar任务也创建其子项的源和javadoc?

时间:2017-06-27 18:43:19

标签: java gradle shadowjar

我有一个包含8个子项目的gradle项目和一个配置的shadowjar任务来创建一个“all”jar。 toplevel项目设置为对其所有子项具有依赖性,这告诉shadowjar要包括什么:

project(':') {
    dependencies {
        compile project(':jfxtras-agenda')
        compile project(':jfxtras-common')
        compile project(':jfxtras-controls')
        compile project(':jfxtras-icalendarfx')
        compile project(':jfxtras-icalendaragenda')
        compile project(':jfxtras-menu')
        compile project(':jfxtras-gauge-linear')
        compile project(':jfxtras-font-roboto')
    }
}

shadowJar {
   classifier = null // do not append "-all", so the generated shadow jar replaces the existing jfxtras-all.jar (instead of generating jfxtras-all-all.jar)
}

这很好用,但maven central拒绝所有jar,因为它没有相关的源和javadocs jar。

如何告诉gradle还生成源和javadoc? ShadowJar的文档说默认情况下应该这样做。

1 个答案:

答案 0 :(得分:5)

影子插件似乎没有构建胖源/ javadocs jar的功能。

下面,我提供一些简短的任务(javadocJarsourcesJar)来构建胖javadoc和源jar。链接始终在shadowJar之后执行。但它不依赖于shadow jar插件。

subprojects {
    apply plugin: 'java'
}

// Must be BELOW subprojects{}
task alljavadoc(type: Javadoc) {
    source subprojects.collect { it.sourceSets.main.allJava }
    classpath = files(subprojects.collect { it.sourceSets.main.compileClasspath })
    destinationDir = file("${buildDir}/docs/javadoc")
}

task javadocJar(type: Jar, dependsOn: alljavadoc) {
    classifier = 'javadoc'
    from alljavadoc.destinationDir
}

task sourcesJar(type: Jar) {
    classifier = 'sources'
    from subprojects.collect { it.sourceSets.main.allSource }
}

shadowJar.finalizedBy javadocJar
shadowJar.finalizedBy sourcesJar

注意,subprojects部分必需,即使您已在子项目中应用java插件。

另请注意,它不包含子项目可能依赖的第三方库的javadoc。但通常你不管怎么说都不想这样做。