12

我有一个带有 8 个子项目的 gradle 项目和一个配置的 shadowjar 任务来创建一个“全部”jar。顶层项目设置为对其所有子项目具有依赖关系,这告诉 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 的文档说它应该默认这样做。

4

2 回答 2

6

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

下面,我提供了一些简短的任务 (javadocJarsourcesJar),它们将构建胖 javadoc 和源 jars。它们被链接为总是在 之后执行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在子项目中应用了该插件。

另请注意,它不包括您的子项目可能依赖的第三方库的 javadocs。但通常你可能不想这样做。

于 2017-11-24T21:52:42.793 回答
0

这是一个旧线程,但我发布了我的解决方案,因为它比上面的要容易得多,而且我已经确认它有效:

plugins {
    id 'com.github.johnrengelman.shadow' version '7.1.0'
    id 'signing'
    id 'maven-publish'
}

// If using Spring Boot, this is needed
jar.enabled = true
jar.dependsOn shadowJar

java {
    withJavadocJar()
    withSourcesJar()
}

// Remove the -all extension from the "fat" Jar, or it can't be used
// when published to Maven Central.
shadowJar {
    archiveClassifier.set('')
}

// The contents of this section are described here:
//   https://docs.gradle.org/current/userguide/publishing_maven.html
publishing {
    publications {
        jwtopaLibrary(MavenPublication) {
            artifactId = 'jwt-opa'
            artifacts = [ shadowJar, javadocJar, sourcesJar ]
            pom {
    // etc. ...
}

// Signs the `publication` generated above with the name `jwtopaLibrary`
// Signing plugin, see: https://docs.gradle.org/current/userguide/signing_plugin.html#signing_plugin
signing {
    sign publishing.publications.jwtopaLibrary
}

任何地方都没有说清楚,需要在多个地方收集信息,但是signing要使插件正常工作,您需要short form十六进制密钥 ID:

# gradle.properties

# The `signing` plugin documentation is less than helpful; 
# however, this is the magic incantation to find the `keyId`:
#
#   gpg --list-signatures --keyid-format 0xshort
#
# The key also needs to be distributed to public GPG servers:
#
#   gpg --keyserver keyserver.ubuntu.com --send-keys 123...fed
#
# In all cases, we need to use the values from the `pub` key.
signing.keyId=0x1234abcde

然后,这只是一个运行的问题./gradlew publish,神奇的事情发生了(嗯,不是真的,你仍然需要去 Sonatype 存储库,做“关闭和释放舞蹈”,但你知道,无论如何)。

于 2021-12-24T23:09:33.330 回答