Skip to content

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

@vlsi

Description

@vlsi

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions