quarkusio/quarkus · error · GradleException
Cannot find deployment project for extension ${extensionArti
Error message
Cannot find deployment project for extension ${extensionArtifactId} with artifact coordinates ${deploymentArtifact} What it means
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.
Source
Thrown at devtools/gradle/gradle-model/src/main/java/io/quarkus/gradle/tooling/dependency/DependencyUtils.java:240
throw new IllegalArgumentException("both extensionConfiguration and extensionDescriptor are null");
}
Project deploymentProject = null;
if (extensionConfiguration != null) {
final String deploymentProjectPath = ConfigurationUtils.getDeploymentModule(extensionConfiguration).get();
deploymentProject = ToolingUtils.findLocalProject(extensionProject, deploymentProjectPath);
if (deploymentProject == null) {
throw new GradleException("Cannot find deployment project for extension " + extensionArtifactId + " at path "
+ deploymentProjectPath);
}
} else if (extensionDescriptor.containsKey(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT)) {
final ArtifactCoords deploymentArtifact = ArtifactCoords
.fromString(extensionDescriptor.getProperty(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT));
deploymentProject = ToolingUtils.findLocalProject(project, deploymentArtifact);
if (deploymentProject == null) {
throw new GradleException("Cannot find deployment project for extension " + extensionArtifactId
+ " with artifact coordinates " + deploymentArtifact);
}
}
final List<Dependency> conditionalDependencies = new ArrayList<>(0);
final List<Dependency> conditionalDevDependencies = new ArrayList<>(0);
final List<ArtifactKey> dependencyConditions = new ArrayList<>(0);
if (extensionConfiguration != null) {
collectConditionalDeps(project, ConfigurationUtils.getConditionalDependencies(extensionConfiguration),
conditionalDependencies);
collectConditionalDeps(project, ConfigurationUtils.getConditionalDevDependencies(extensionConfiguration),
conditionalDevDependencies);
final ListProperty<String> dependencyConditionsProp = ConfigurationUtils
.getDependencyConditions(extensionConfiguration);
if (dependencyConditionsProp.isPresent()) {
for (String rawCond : dependencyConditionsProp.get()) {View on GitHub (pinned to e1c734241f)
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
Example fix
// before (stale descriptor) deployment-artifact=com.example:old-name-deployment:1.0 // after deployment-artifact=com.example:new-name-deployment:1.0
Defensive patterns
Strategy: validation
Validate before calling
String coords = descriptor.getProperty("deployment-artifact");
if (coords != null) {
var c = ArtifactCoords.fromString(coords);
if (project.findProject(":" + c.getName()) == null) {
logger.warn("deployment-artifact " + coords + " has no matching local project");
}
} Try / catch
try {
var dep = DependencyUtils.getProjectExtensionDependencyOrNull(project, path, buildPath);
} catch (GradleException e) {
if (e.getMessage().contains("with artifact coordinates")) {
// fix deployment-artifact in quarkus-extension.properties or set quarkus{deploymentModule}
} else throw e;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- both extensionConfiguration and extensionDescriptor are null
- Failed to parse removed resource '
- Failed to persist extension descriptor
- e.getMessage()
- Failed to persist
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/64c95b7d520104b6.
Report an issue: GitHub.