{"record":{"id":"64c95b7d520104b6","repo":"quarkusio/quarkus","slug":"cannot-find-deployment-project-for-extension-ext-64c95b","errorCode":null,"errorMessage":"Cannot find deployment project for extension ${extensionArtifactId} with artifact coordinates ${deploymentArtifact}","messagePattern":"Cannot find deployment project for extension (.+?) with artifact coordinates (.+?)","errorType":"exception","errorClass":"GradleException","httpStatus":null,"severity":"error","filePath":"devtools/gradle/gradle-model/src/main/java/io/quarkus/gradle/tooling/dependency/DependencyUtils.java","lineNumber":240,"sourceCode":"            throw new IllegalArgumentException(\"both extensionConfiguration and extensionDescriptor are null\");\n        }\n\n        Project deploymentProject = null;\n\n        if (extensionConfiguration != null) {\n            final String deploymentProjectPath = ConfigurationUtils.getDeploymentModule(extensionConfiguration).get();\n            deploymentProject = ToolingUtils.findLocalProject(extensionProject, deploymentProjectPath);\n            if (deploymentProject == null) {\n                throw new GradleException(\"Cannot find deployment project for extension \" + extensionArtifactId + \" at path \"\n                        + deploymentProjectPath);\n            }\n        } else if (extensionDescriptor.containsKey(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT)) {\n            final ArtifactCoords deploymentArtifact = ArtifactCoords\n                    .fromString(extensionDescriptor.getProperty(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT));\n            deploymentProject = ToolingUtils.findLocalProject(project, deploymentArtifact);\n\n            if (deploymentProject == null) {\n                throw new GradleException(\"Cannot find deployment project for extension \" + extensionArtifactId\n                        + \" with artifact coordinates \" + deploymentArtifact);\n            }\n        }\n\n        final List<Dependency> conditionalDependencies = new ArrayList<>(0);\n        final List<Dependency> conditionalDevDependencies = new ArrayList<>(0);\n        final List<ArtifactKey> dependencyConditions = new ArrayList<>(0);\n\n        if (extensionConfiguration != null) {\n            collectConditionalDeps(project, ConfigurationUtils.getConditionalDependencies(extensionConfiguration),\n                    conditionalDependencies);\n            collectConditionalDeps(project, ConfigurationUtils.getConditionalDevDependencies(extensionConfiguration),\n                    conditionalDevDependencies);\n\n            final ListProperty<String> dependencyConditionsProp = ConfigurationUtils\n                    .getDependencyConditions(extensionConfiguration);\n            if (dependencyConditionsProp.isPresent()) {\n                for (String rawCond : dependencyConditionsProp.get()) {","sourceCodeStart":222,"sourceCodeEnd":258,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/devtools/gradle/gradle-model/src/main/java/io/quarkus/gradle/tooling/dependency/DependencyUtils.java#L222-L258","documentation":"For extensions detected only via their quarkus-extension.properties descriptor (no quarkus { } configuration), createExtensionDependency reads the deployment-artifact property and tries to find a local Gradle project producing those artifact coordinates via ToolingUtils.findLocalProject. If no local project matches the deployment artifact coordinates, a GradleException is thrown listing the extension and deployment coordinates. This is expected when the deployment artifact is a plain external dependency (not built in this build), but thrown when the tooling believed it should be local.","triggerScenarios":"getExtensionInfoOrNull -> createExtensionDependency on a project with META-INF/quarkus-extension.properties whose deployment-artifact property points at coordinates that do not match any local project's group:name — often after changing group/artifact IDs or when the descriptor is stale.","commonSituations":"Renaming an extension's groupId or artifactId without regenerating the descriptor; copying a descriptor from another extension; a multi-module setup where the deployment module version differs from the published coordinates in the descriptor; included builds where findLocalProject cannot match composite project artifacts.","solutions":["Update META-INF/quarkus-extension.properties so deployment-artifact matches the actual deployment module's group:artifact:version","Apply the io.quarkus.extension plugin and set quarkus { deploymentModule } so the path-based lookup is used instead of coordinates matching","Verify the deployment project's group/name in build.gradle match the coordinates in the descriptor","Clean and rebuild the extension project so the packaged descriptor is regenerated from current settings","Run ./gradlew projects and compare group:name of the deployment project with the coordinates in the error"],"exampleFix":"// before (stale descriptor)\ndeployment-artifact=com.example:old-name-deployment:1.0\n// after\ndeployment-artifact=com.example:new-name-deployment:1.0","handlingStrategy":"validation","validationCode":"String coords = descriptor.getProperty(\"deployment-artifact\");\nif (coords != null) {\n    var c = ArtifactCoords.fromString(coords);\n    if (project.findProject(\":\" + c.getName()) == null) {\n        logger.warn(\"deployment-artifact \" + coords + \" has no matching local project\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    var dep = DependencyUtils.getProjectExtensionDependencyOrNull(project, path, buildPath);\n} catch (GradleException e) {\n    if (e.getMessage().contains(\"with artifact coordinates\")) {\n        // fix deployment-artifact in quarkus-extension.properties or set quarkus{deploymentModule}\n    } else throw e;\n}","preventionTips":["Regenerate quarkus-extension.properties whenever groupId/artifactId/version change","Prefer the io.quarkus.extension plugin with deploymentModule over hand-written descriptors","Validate descriptor deployment-artifact coordinates against actual deployment project group:name","Avoid copying descriptors between extension projects"],"tags":["gradle","extension","descriptor","deployment-artifact"],"backgroundTag":"quarkus-deployment-module-not-found","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}