gradle / gradle/plugin-portal-requests

com.gradle.plugin-publish adds javadocElements configuration very late, so it causes conflicts with user-defined javadocElement configuration

Open
#247 2 comments 3 reactions 0 assignees View on GitHub
a:bug publishing-plugin
Dominant language
No language data
Stars
15
Forks
6
PR merge metrics
No merged PRs in 30d

Description

### 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

```kotlin
// https://github.com/gradle/gradle/pull/16627
inline fun AttributeContainer.attribute(attr: Attribute, value: String) =
attribute(attr, objects.named(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`:

```kotlin
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 https://github.com/sigstore/sigstore-java/pull/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

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.