gradle-maven-publish-plugin icon indicating copy to clipboard operation
gradle-maven-publish-plugin copied to clipboard

Javadoc jar is empty when applying Kotlin, Dokka, and pluginPublish plugins

Open Goooler opened this issue 7 months ago • 2 comments

Apply

plugins {
  id("org.jetbrains.kotlin.jvm") version "2.1.20"
  id("org.jetbrains.dokka") version "2.0.0"
  id("com.vanniktech.maven.publish") version "0.31.0"
  id("com.gradle.plugin-publish") version "1.3.1"
}

in a Gradle plugin project written in Kotlin only, and run ./gradlew publishToMavenLocal, you'll see

> Task :checkKotlinGradlePluginConfigurationErrors SKIPPED
> Task :pluginDescriptors
> Task :processResources
> Task :generatePomFileForPluginMavenPublication
> Task :sourcesJar
> Task :generatePomFileForShadowPluginPluginMarkerMavenPublication
> Task :signShadowPluginPluginMarkerMavenPublication
> Task :publishShadowPluginPluginMarkerMavenPublicationToMavenLocal
> Task :compileKotlin
> Task :compileJava NO-SOURCE
> Task :classes
> Task :javadoc NO-SOURCE
> Task :javadocJar
> Task :jar
> Task :generateMetadataFileForPluginMavenPublication
> Task :signPluginMavenPublication
> Task :publishPluginMavenPublicationToMavenLocal
> Task :publishToMavenLocal

The javadocJar task is useless, and an empty javadoc.jar will be published.

dua ~/.m2/repository/com/gradleup/shadow/shadow-gradle-plugin/9.0.0-SNAPSHOT/
   4.10 KB maven-metadata-local.xml
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar.asc
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT-sources.jar.asc
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.jar.asc
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.module.asc
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.pom
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.pom.asc
  12.29 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.module
  61.44 KB shadow-gradle-plugin-9.0.0-SNAPSHOT-sources.jar
 212.99 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.jar
 319.49 KB total

Replace id("com.gradle.plugin-publish") version "1.3.1" with id("java-gradle-plugin") and try again, you'll see

> Task :checkKotlinGradlePluginConfigurationErrors SKIPPED
> Task :generatePomFileForShadowPluginPluginMarkerMavenPublication
> Task :generatePomFileForPluginMavenPublication
> Task :signShadowPluginPluginMarkerMavenPublication UP-TO-DATE
> Task :sourcesJar UP-TO-DATE
> Task :pluginDescriptors UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :publishShadowPluginPluginMarkerMavenPublicationToMavenLocal
> Task :compileKotlin
> Task :compileJava NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar UP-TO-DATE
> Task :generateMetadataFileForPluginMavenPublication
> Task :dokkaGeneratePublicationHtml
> Task :logLinkDokkaGeneratePublicationHtml
Generated Dokka HTML publication: http://localhost:63342/shadow/docs/api/index.html
> Task :pluginMavenDokkaJavadocJar
> Task :signPluginMavenPublication
> Task :publishPluginMavenPublicationToMavenLocal
> Task :publishToMavenLocal

The pluginMavenDokkaJavadocJar task will be executed instead of javadocJar, and the valid javadoc.jar will be published.

dua ~/.m2/repository/com/gradleup/shadow/shadow-gradle-plugin/9.0.0-SNAPSHOT/
   4.10 KB maven-metadata-local.xml
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar.asc
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT-sources.jar.asc
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.jar.asc
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.module.asc
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.pom
   4.10 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.pom.asc
   8.19 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.module
  61.44 KB shadow-gradle-plugin-9.0.0-SNAPSHOT-sources.jar
 262.14 KB shadow-gradle-plugin-9.0.0-SNAPSHOT.jar
   1.05 MB shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar
   1.41 MB total

There is a full diff between the before and the after:

Folder Diff Details

diff --color=auto -r 9.0.0-SNAPSHOT-before/maven-metadata-local.xml 9.0.0-SNAPSHOT-after/maven-metadata-local.xml
6c6
<     <lastUpdated>20250414021245</lastUpdated>
---
>     <lastUpdated>20250414021317</lastUpdated>
12c12,13
<         <extension>jar</extension>
---
>         <classifier>sources</classifier>
>         <extension>jar.asc</extension>
14c15
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
17c18
<         <extension>jar.asc</extension>
---
>         <extension>jar</extension>
19c20
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
22,23c23
<         <classifier>javadoc</classifier>
<         <extension>jar.asc</extension>
---
>         <extension>pom</extension>
25c25
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
29c29
<         <extension>jar.asc</extension>
---
>         <extension>jar</extension>
31c31
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
36c36
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
39c39,40
<         <extension>pom</extension>
---
>         <classifier>javadoc</classifier>
>         <extension>jar.asc</extension>
41c42
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
47c48
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
50,51c51
<         <classifier>sources</classifier>
<         <extension>jar</extension>
---
>         <extension>pom.asc</extension>
53c53
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
56c56
<         <extension>pom.asc</extension>
---
>         <extension>module.asc</extension>
58c58
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
61c61
<         <extension>module.asc</extension>
---
>         <extension>jar.asc</extension>
63c63
<         <updated>20250414021245</updated>
---
>         <updated>20250414021317</updated>
Binary files 9.0.0-SNAPSHOT-before/shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar and 9.0.0-SNAPSHOT-after/shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar differ
diff --color=auto -r 9.0.0-SNAPSHOT-before/shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar.asc 9.0.0-SNAPSHOT-after/shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar.asc
4,6c4,6
< iF4EABYKAAYFAmf8bx0ACgkQAgvaYjxlHg7OWwEAyjXI2T1wfEJwdPnxIortktvW
< PVXagUFsCDKxYmzhA0sA/R0licbef1xPBAOxwAmFrez2m+31ttVSDIODghsT298N
< =UIQx
---
> iF4EABYKAAYFAmf8bz0ACgkQAgvaYjxlHg5BkgEAynqQmeVZVyNJ1ngF4mjucbXZ
> h14PGwxxa7+bfp7fVywA/3qctGS+isOGRD6YxFm66uU4SacFY0F5zhZ1zBd2YecD
> =UYb/
diff --color=auto -r 9.0.0-SNAPSHOT-before/shadow-gradle-plugin-9.0.0-SNAPSHOT-sources.jar.asc 9.0.0-SNAPSHOT-after/shadow-gradle-plugin-9.0.0-SNAPSHOT-sources.jar.asc
4,6c4,6
< iF4EABYKAAYFAmf8bx0ACgkQAgvaYjxlHg6M7gEAmNe9GpJG6XlMrNtE9PgEeTQa
< vboQxlvI8RpxbS/SOEIBAP6ZGAMWrgDGLrITc/outWrYdkED+vcNY2hvQohgI1AD
< =3FiM
---
> iF4EABYKAAYFAmf8bz0ACgkQAgvaYjxlHg6Y9AD+IEUv0C0A3BaR7ihd+I2SG6Oi
> lsmFkKygmv2o6GnqQGwA/1y58xs7P1mn8+wCnOwMut8gH8WWpzZizXroW5YEacAL
> =F+Mc
diff --color=auto -r 9.0.0-SNAPSHOT-before/shadow-gradle-plugin-9.0.0-SNAPSHOT.jar.asc 9.0.0-SNAPSHOT-after/shadow-gradle-plugin-9.0.0-SNAPSHOT.jar.asc
4,6c4,6
< iF4EABYKAAYFAmf8bx0ACgkQAgvaYjxlHg5jnAEA4J8o5K3rdUv5e43znhNMIYUN
< aT9T2ofBY1WnQ6JBVoABALM22ubHiEC33DcI5bS/6dWw6M5zwMDVm17lNiH9/iEK
< =fJnf
---
> iF4EABYKAAYFAmf8bz0ACgkQAgvaYjxlHg6eWwD/UVXkA2yNXQc8VJxCFbPzuog6
> RwetpYUwMCf77zHgnDABAP5+GOo8kKrVBD4m+ugqw6R8W3ATffITsIdb82kqFt0O
> =QupS
diff --color=auto -r 9.0.0-SNAPSHOT-before/shadow-gradle-plugin-9.0.0-SNAPSHOT.module 9.0.0-SNAPSHOT-after/shadow-gradle-plugin-9.0.0-SNAPSHOT.module
186,237d185
<       "name": "javadocElements",
<       "attributes": {
<         "org.gradle.category": "documentation",
<         "org.gradle.dependency.bundling": "external",
<         "org.gradle.docstype": "javadoc",
<         "org.gradle.usage": "java-runtime"
<       },
<       "files": [
<         {
<           "name": "shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar",
<           "url": "shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar",
<           "size": 261,
<           "sha512": "d218d40fcd425e4886a48a1a668b427dd192a1939035d29dae15b430d4f57b40cb0bfc5402453da81e003ba713a1494e7f17cb6aff0df08540f4809d54543708",
<           "sha256": "340cc78aae103c797ae417411e71f66132a34988e4046291d5d4707b8a15e62b",
<           "sha1": "9c02f4f0a239610d50bd3198f3c2704402c50eec",
<           "md5": "e37b79339ba5959eee9e5e568167c723"
<         }
<       ],
<       "capabilities": [
<         {
<           "group": "com.github.jengelman.gradle.plugins",
<           "name": "shadow",
<           "version": "9.0.0-SNAPSHOT"
<         },
<         {
<           "group": "com.github.johnrengelman",
<           "name": "shadow",
<           "version": "9.0.0-SNAPSHOT"
<         },
<         {
<           "group": "com.gradleup.shadow",
<           "name": "shadow-gradle-plugin",
<           "version": "9.0.0-SNAPSHOT"
<         },
<         {
<           "group": "gradle.plugin.com.github.jengelman.gradle.plugins",
<           "name": "shadow",
<           "version": "9.0.0-SNAPSHOT"
<         },
<         {
<           "group": "io.github.goooler.shadow",
<           "name": "shadow-gradle-plugin",
<           "version": "9.0.0-SNAPSHOT"
<         },
<         {
<           "group": "gradle.plugin.com.github.johnrengelman",
<           "name": "shadow",
<           "version": "9.0.0-SNAPSHOT"
<         }
<       ]
<     },
<     {
diff --color=auto -r 9.0.0-SNAPSHOT-before/shadow-gradle-plugin-9.0.0-SNAPSHOT.module.asc 9.0.0-SNAPSHOT-after/shadow-gradle-plugin-9.0.0-SNAPSHOT.module.asc
4,6c4,6
< iF4EABYKAAYFAmf8bx0ACgkQAgvaYjxlHg6SwwD/SSR/Srrtbz9Ek/dHClHEEnBg
< aSfbjIiSSR71r/W/8GgBAJboTqQlD6b2FBiai0XCfNXR25FBrM7K5WnPpqG1kiAA
< =o4An
---
> iF4EABYKAAYFAmf8bz0ACgkQAgvaYjxlHg4cJQEAs6zEKb+lE3UAaNFl7AUU/JXQ
> NlC+bPG09XYjCNybihYBAN3yqGF0f+ovVvrGoj30KtLVOSTCv739RTMiCjH3L78P
> =hutz
diff --color=auto -r 9.0.0-SNAPSHOT-before/shadow-gradle-plugin-9.0.0-SNAPSHOT.pom.asc 9.0.0-SNAPSHOT-after/shadow-gradle-plugin-9.0.0-SNAPSHOT.pom.asc
4,6c4,6
< iF4EABYKAAYFAmf8bx0ACgkQAgvaYjxlHg7FgQEA2yjYjY1kaTWmX63FpdDrCOuo
< /skGT4mD/uLdzcbKch0A/1qghoxLl+9ae9+g4oWJW90+ON+4h9yedPUuIsRA68AF
< =Hh8V
---
> iF4EABYKAAYFAmf8bz0ACgkQAgvaYjxlHg5h5QEAoYfAVb4PFuSUytQupxgpOx3H
> zvCcHK0zci8Hf5LTJeYA/ijkM9bpjDTQpfmB8g7Va71ToMPFP+3eaOM3ILFbH0QG
> =eZSN

shadow-gradle-plugin-9.0.0-SNAPSHOT-javadoc.jar.diff.txt

You can repro this issue in https://github.com/GradleUp/shadow, I especially tested it at e817284ca1e95df6f525a1bc652f2ef68f553c52.

Goooler avatar Apr 14 '25 02:04 Goooler

Plugin publish plugin did nothing for Dokka, see

Image

We have to call defaultJavaDocOption before GradlePublishPlugin

https://github.com/vanniktech/gradle-maven-publish-plugin/blob/f22bd35c84c3df28700db4ca3de11d5b78a29fde/plugin/src/main/kotlin/com/vanniktech/maven/publish/MavenPublishBaseExtension.kt#L392-L393

or file this issue to plugin-publish side.

Goooler avatar Apr 14 '25 10:04 Goooler

The reason why it's not configured right now is that com.gradle.plugin-publish is creating the javadoc jar task. We could still detect that dokka is applied and then configure that dokka's output is used as input for that task.

gabrielittner avatar Apr 21 '25 20:04 gabrielittner

The Gradle publish plugin does this internally which is hard to override

JavaPluginExtension javaPluginExtension = project.getExtensions().getByType(JavaPluginExtension.class);
javaPluginExtension.withJavadocJar();

There is this pretty old issue on their side https://github.com/gradle/plugin-portal-requests/issues/247. Closing this for now since I don't see much we can do

gabrielittner avatar Jun 21 '25 10:06 gabrielittner

As java-gradle-plugin applies com.gradle.plugin-publish, I guess we can fix this by replacing

https://github.com/vanniktech/gradle-maven-publish-plugin/blob/b4b02a655660125529d60d93ea3b390858705bae/plugin/src/main/kotlin/com/vanniktech/maven/publish/MavenPublishBaseExtension.kt#L474-L477

with

      project.plugins.hasPlugin("com.gradle.plugin-publish") ||
      project.plugins.hasPlugin("java-gradle-plugin") ->
        configure(GradlePlugin(defaultJavaDocOption(javadocJar, plainJavadocSupported = true), sourcesJar))

EDIT: we can't.

Goooler avatar Jun 22 '25 15:06 Goooler

I noticed a workaround for this issue:

afterEvaluate {
    tasks.named<Jar>("javadocJar") {
        from(tasks.dokkaGeneratePublicationJavadoc)
    }
}

See https://github.com/gmazzo/gradle-buildconfig-plugin/blob/05718d048acd733450fb3ed31231bc31a375ebf8/plugin/build.gradle.kts#L112-L116.

Should we patch it from the plugin side?

Goooler avatar Nov 09 '25 20:11 Goooler