{"record":{"id":"4cf0c353ae31df39","repo":"gradle/gradle","slug":"cannot-query-artifacts-for-a-project-component-s","errorCode":null,"errorMessage":"Cannot query artifacts for a project component (%s).","messagePattern":"Cannot query artifacts for a project component \\((.+?)\\)\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"platforms/software/dependency-management/src/main/java/org/gradle/api/internal/artifacts/query/DefaultArtifactResolutionQuery.java","lineNumber":193,"sourceCode":"\n        for (ComponentIdentifier componentId : componentIds) {\n            try {\n                ComponentIdentifier validId = validateComponentIdentifier(componentId);\n                componentResults.add(buildComponentResult(validId, componentMetaDataResolver, artifactResolver));\n            } catch (Exception t) {\n                componentResults.add(new DefaultUnresolvedComponentResult(componentId, t));\n            }\n        }\n\n        return new DefaultArtifactResolutionResult(componentResults);\n    }\n\n    private ComponentIdentifier validateComponentIdentifier(ComponentIdentifier componentId) {\n        if (componentId instanceof ModuleComponentIdentifier) {\n            return componentId;\n        }\n        if (componentId instanceof ProjectComponentIdentifier) {\n            throw new IllegalArgumentException(String.format(\"Cannot query artifacts for a project component (%s).\", componentId.getDisplayName()));\n        }\n\n        throw new IllegalArgumentException(String.format(\"Cannot resolve the artifacts for component %s with unsupported type %s.\", componentId.getDisplayName(), componentId.getClass().getName()));\n    }\n\n    private ComponentArtifactsResult buildComponentResult(ComponentIdentifier componentId, ComponentMetaDataResolver componentMetaDataResolver, ArtifactResolver artifactResolver) {\n        BuildableComponentResolveResult moduleResolveResult = new DefaultBuildableComponentResolveResult();\n        componentMetaDataResolver.resolve(componentId, DefaultComponentOverrideMetadata.EMPTY, moduleResolveResult);\n        ComponentArtifactResolveMetadata component = moduleResolveResult.getState().prepareForArtifactResolution().getArtifactMetadata();\n        DefaultComponentArtifactsResult componentResult = new DefaultComponentArtifactsResult(component.getId());\n        for (Class<? extends Artifact> artifactType : artifactTypes) {\n            addArtifacts(componentResult, artifactType, component, artifactResolver);\n        }\n        return componentResult;\n    }\n\n    private <T extends Artifact> void addArtifacts(\n        DefaultComponentArtifactsResult artifacts,","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/gradle/gradle/blob/534f27719b66953f95cc907aae7f2c1b12f5482d/platforms/software/dependency-management/src/main/java/org/gradle/api/internal/artifacts/query/DefaultArtifactResolutionQuery.java#L175-L211","documentation":"ArtifactResolutionQuery resolves artifacts from repositories, so it only accepts module components (ModuleComponentIdentifier: group:name:version from a repo). validateComponentIdentifier() explicitly rejects ProjectComponentIdentifier — components belonging to a project in the (composite) build — with this IllegalArgumentException, because a local project has no repository artifacts to query.","triggerScenarios":"Passing identifiers taken from a ResolutionResult straight into forComponents(...): resolution results mix external modules with local project components, and any project component id (from a subproject or an included-build substitution) triggers the error on execute().","commonSituations":"Tooling that iterates allComponents and queries artifact files (sources, licenses, module metadata); composite builds where dependencies substitute to included projects; dependency substitutions turning an external coordinate into a local project.","solutions":["Filter to module components before querying: ids.findAll { it instanceof ModuleComponentIdentifier } (Groovy) or ids.filterIsInstance<ModuleComponentIdentifier>() (Kotlin).","Handle project components separately — they are in the build, so read their artifacts via their own configurations/artifact views.","If you expected a module coordinate, inspect why it resolved to a project: dependency substitution rules or includeBuild substitution are the usual causes."],"exampleFix":"// before\ndef ids = configurations.runtimeClasspath.incoming.resolutionResult.allComponents*.id\ndef result = dependencies.createArtifactResolutionQuery()\n        .forComponents(ids) // contains ProjectComponentIdentifier -> throws\n        .withArtifacts(ComponentWithModule.class, MavenModuleArtifact.class).execute()\n// after\ndef moduleIds = ids.findAll { it instanceof ModuleComponentIdentifier }\ndef result = dependencies.createArtifactResolutionQuery()\n        .forComponents(moduleIds)\n        .withArtifacts(ComponentWithModule.class, MavenModuleArtifact.class).execute()","handlingStrategy":"type-guard","validationCode":"def moduleIds = ids.findAll { isQueryableComponent(it) }\ndef result = dependencies.createArtifactResolutionQuery()\n        .forComponents(moduleIds)\n        .withArtifacts(ComponentWithModule.class, MavenModuleArtifact.class).execute()","typeGuard":"static boolean isQueryableComponent(ComponentIdentifier id) {\n    return id instanceof org.gradle.api.artifacts.component.ModuleComponentIdentifier\n}","tryCatchPattern":null,"preventionTips":["Always filter resolution-result ids to ModuleComponentIdentifier before forComponents","Remember composite builds and substitutions turn coordinates into project components","Serve local project artifacts from their own configurations, not from ARQ"],"tags":["gradle","artifact-resolution-query","component-identifier","composite-builds"],"backgroundTag":"unsupported-argument-type","analyzedSha":"534f27719b66953f95cc907aae7f2c1b12f5482d","analyzedAt":"2026-08-22T08:09:12.375Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}