{"record":{"id":"f03082582d86067a","repo":"gradle/gradle","slug":"publication-with-name-s-added-multiple-times","errorCode":null,"errorMessage":"Publication with name '%s' added multiple times","messagePattern":"Publication with name '(.+?)' added multiple times","errorType":"exception","errorClass":"InvalidUserDataException","httpStatus":null,"severity":"error","filePath":"platforms/software/publish/src/main/java/org/gradle/api/publish/internal/DefaultPublicationContainer.java","lineNumber":33,"sourceCode":" */\n\npackage org.gradle.api.publish.internal;\n\nimport org.gradle.api.InvalidUserDataException;\nimport org.gradle.api.internal.CollectionCallbackActionDecorator;\nimport org.gradle.api.internal.DefaultPolymorphicDomainObjectContainer;\nimport org.gradle.api.publish.Publication;\nimport org.gradle.api.publish.PublicationContainer;\nimport org.gradle.internal.reflect.Instantiator;\n\npublic class DefaultPublicationContainer extends DefaultPolymorphicDomainObjectContainer<Publication> implements PublicationContainer {\n    public DefaultPublicationContainer(Instantiator instantiator, CollectionCallbackActionDecorator collectionCallbackActionDecorator) {\n        super(Publication.class, instantiator, instantiator, collectionCallbackActionDecorator);\n    }\n\n    @Override\n    protected void handleAttemptToAddItemWithNonUniqueName(Publication o) {\n        throw new InvalidUserDataException(String.format(\"Publication with name '%s' added multiple times\", o.getName()));\n    }\n}\n","sourceCodeStart":15,"sourceCodeEnd":36,"githubUrl":"https://github.com/gradle/gradle/blob/534f27719b66953f95cc907aae7f2c1b12f5482d/platforms/software/publish/src/main/java/org/gradle/api/publish/internal/DefaultPublicationContainer.java#L15-L36","documentation":"PublicationContainer is Gradle's polymorphic container for publishing publications; domain object containers enforce name uniqueness, and this container overrides handleAttemptToAddItemWithNonUniqueName to throw InvalidUserDataException as soon as a second publication with an existing name is added.","triggerScenarios":"publishing { publications { maven(MavenPublication) { ... }; maven(MavenPublication) { ... } } }, or register('maven') followed by create('maven'), or two applied plugins each creating a publication named 'maven' in the same project.","commonSituations":"A custom plugin plus maven-publish both creating publications with the same name; loops generating publications from lists that contain duplicate names; refactors leaving a create() call next to an existing register() call.","solutions":["Use unique publication names ('maven', 'mavenJava', 'mavenKotlin')","Configure the existing publication instead of re-creating it: publishing.publications.named('maven') { ... }","Check existence first: if (publishing.publications.findByName('maven') == null) { ... create ... }","Print publishing.publications.names during configuration to find which script/plugin registers the duplicate"],"exampleFix":"// before\ndef names = ['maven', 'maven']\nnames.each { n ->\n    publishing.publications.create(n, MavenPublication) { from components.java } // second add throws\n}\n// after\ndef names = ['maven', 'mavenExtra']\nnames.each { n ->\n    publishing.publications.create(n, MavenPublication) { from components.java }\n}","handlingStrategy":"validation","validationCode":"def addPublication = { String name, Class type, Closure cfg ->\n    if (publishing.publications.findByName(name) != null) {\n        throw new GradleException(\"Publication '$name' already exists - choose another name\")\n    }\n    publishing.publications.create(name, type, cfg)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Generate publication names from a de-duplicated list or map key","Prefer named('x') { ... } to reconfigure an existing publication instead of create()","When writing a plugin, check publications.findByName(name) before creating"],"tags":["publishing","gradle","duplicate","naming","configuration"],"backgroundTag":"duplicate-name-registration","analyzedSha":"534f27719b66953f95cc907aae7f2c1b12f5482d","analyzedAt":"2026-08-22T08:09:12.375Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}