Expected Behavior
There should be a way to write Gradle plugins with Kotlin.
com.gradle.plugin-publish should refrain from adding configurations in afterEvaluate.
Frankly speaking, I would be fine if plugin-publish added javadocElements always, however, the current behaviour is surprising, it causes warnings, and it will probably cause failures with Gradle 8.0
Current Behavior
I used my own configuration to publish javadoc files generated by Dokka
// https://github.com/gradle/gradle/pull/16627
inline fun <reified T: Named> AttributeContainer.attribute(attr: Attribute<T>, value: String) =
attribute(attr, objects.named<T>(value))
val javadocMainElements by configurations.creating {
isVisible = false
description = "Javadoc code elements"
isCanBeResolved = false
isCanBeConsumed = true
attributes {
attribute(Category.CATEGORY_ATTRIBUTE, Category.DOCUMENTATION)
attribute(DocsType.DOCS_TYPE_ATTRIBUTE, DocsType.JAVADOC)
attribute(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME)
attribute(Bundling.BUNDLING_ATTRIBUTE, Bundling.EXTERNAL)
}
}
val javadocJar by tasks.registering(Jar::class) {
group = LifecycleBasePlugin.BUILD_GROUP
description = "Assembles a jar archive containing javadoc"
from(tasks.dokkaJavadoc)
archiveClassifier.set("javadoc")
}
javadocMainElements.outgoing.artifact(javadocJar)
(components["java"] as AdhocComponentWithVariants).addVariantsFromConfiguration(javadocMainElements) {
mapToOptional()
mapToMavenScope("runtime")
}
Unfortunately, it causes a warning:
Consumable configurations with identical capabilities within a project must have unique attributes, but configuration ':sigstore-gradle:sigstore-gradle-sign-base-plugin:javadocMainElements' and configuration ':sigstore-gradle:sigstore-gradle-sign-base-plugin:javadocElements' contain identical attribute sets.
This will fail with an error in Gradle 8.0. Consider adding an additional attribute to one of the configurations to disambiguate them. Run the 'outgoingVariants' task for more details. Consult the upgrading guide for further information: https://docs.gradle.org/7.4.2/userguide/upgrading_version_7.html#unique_attribute_sets
As I tried to figure out what adds javadocElements configuration, I found it was plugin-publish:
configurations.all{
if (name =="javadocElements") {
TODO("javadocElements should not be created")
}
}
Note PublishPlugin.forceJavadocAndSourcesJars below.
org.gradle.internal.event.ListenerNotificationException: Failed to notify project evaluation listener.
at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:89)
at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)
at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)
at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:247)
at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:244)
at org.gradle.api.internal.project.DefaultProject.stepEvaluationListener(DefaultProject.java:1433)
at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:253)
... 139 more
kotlin.NotImplementedError: An operation is not implemented: javadocElements should not be created
at Build_logic_kotlin_gradle$2.execute(build-logic.kotlin.gradle.kts:13)
at Build_logic_kotlin_gradle$2.execute(build-logic.kotlin.gradle.kts:1)
at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
at org.gradle.api.internal.DefaultCollectionCallbackActionDecorator$BuildOperationEmittingAction$1.run(DefaultCollectionCallbackActionDecorator.java:110)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
at org.gradle.api.internal.DefaultCollectionCallbackActionDecorator$BuildOperationEmittingAction.execute(DefaultCollectionCallbackActionDecorator.java:107)
at org.gradle.internal.ImmutableActionSet$SetWithManyActions.execute(ImmutableActionSet.java:329)
at org.gradle.api.internal.DefaultDomainObjectCollection.doAdd(DefaultDomainObjectCollection.java:262)
at org.gradle.api.internal.DefaultNamedDomainObjectCollection.doAdd(DefaultNamedDomainObjectCollection.java:113)
at org.gradle.api.internal.DefaultDomainObjectCollection.add(DefaultDomainObjectCollection.java:251)
at org.gradle.api.internal.AbstractNamedDomainObjectContainer.create(AbstractNamedDomainObjectContainer.java:79)
at org.gradle.api.internal.AbstractValidatingNamedDomainObjectContainer.create(AbstractValidatingNamedDomainObjectContainer.java:47)
at org.gradle.api.internal.AbstractNamedDomainObjectContainer.create(AbstractNamedDomainObjectContainer.java:56)
at org.gradle.api.internal.AbstractNamedDomainObjectContainer.maybeCreate(AbstractNamedDomainObjectContainer.java:65)
at org.gradle.api.plugins.internal.JvmPluginsHelper.maybeCreateInvisibleConfig(JvmPluginsHelper.java:261)
at org.gradle.api.plugins.internal.JvmPluginsHelper.configureDocumentationVariantWithArtifact(JvmPluginsHelper.java:224)
at org.gradle.api.plugins.internal.DefaultJavaPluginExtension.withJavadocJar(DefaultJavaPluginExtension.java:215)
at com.gradle.publish.PublishPlugin.forceJavadocAndSourcesJars(PublishPlugin.java:125)
at com.gradle.publish.PublishPlugin.lambda$apply$3(PublishPlugin.java:104)
at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:171)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:168)
at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:95)
at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:83)
at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:61)
... 148 more
Context
See sigstore/sigstore-java#98
Steps to Reproduce
Create a plugin in Kotlin (==no regular javadoc jar). There should be a way to add dokka-generated jar to javadocs.
Your Environment
Gradle 7.4.2
com.gradle.plugin-publish.gradle.plugin:1.0.0
Expected Behavior
There should be a way to write Gradle plugins with Kotlin.
com.gradle.plugin-publishshould refrain from adding configurations inafterEvaluate.Frankly speaking, I would be fine if
plugin-publishaddedjavadocElementsalways, however, the current behaviour is surprising, it causes warnings, and it will probably cause failures with Gradle 8.0Current Behavior
I used my own configuration to publish javadoc files generated by Dokka
Unfortunately, it causes a warning:
As I tried to figure out what adds
javadocElementsconfiguration, I found it wasplugin-publish:configurations.all{ if (name =="javadocElements") { TODO("javadocElements should not be created") } }Note
PublishPlugin.forceJavadocAndSourcesJarsbelow.Context
See sigstore/sigstore-java#98
Steps to Reproduce
Create a plugin in Kotlin (==no regular javadoc jar). There should be a way to add dokka-generated jar to javadocs.
Your Environment
Gradle 7.4.2
com.gradle.plugin-publish.gradle.plugin:1.0.0