Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolving of manually created configuration creates a ResolveException #23985

Closed
klu2 opened this issue Feb 21, 2023 · 1 comment
Closed

Resolving of manually created configuration creates a ResolveException #23985

klu2 opened this issue Feb 21, 2023 · 1 comment
Assignees
Labels
a:regression This used to work in:dependency-resolution engine metadata
Milestone

Comments

@klu2
Copy link

klu2 commented Feb 21, 2023

Expected Behavior

We are the author of https://github.com/cloudflightio/license-gradle-plugin, a plugin which creates enhanced dependency reports along with license reports (i.e. which library is used with which license). In order to achieve that, we parse the POM files of resolved artifacts, but sometimes we also need to fetch parent poms also BOMs.

Our current way to achieve that (i.e. resolve the parent poms), was to create a dynamic configuration, add the parent dependencies, and then parse the POMs. See the method resolveCompanionArtifacts https://github.com/cloudflightio/license-gradle-plugin/blob/master/src/main/kotlin/io/cloudflight/license/gradle/task/LicenseReportTask.kt#L179:

val configuration = project.configurations.create(type + UUID.randomUUID())

dependencies
   .map { if (classifier != null) "${it.key}:$classifier@$type" else "${it.key}@$type" }
   .forEach { project.dependencies.add(configuration.name, it) }

val artifacts = configuration
   .resolvedConfiguration
   .lenientConfiguration
   .artifacts
   .sortedBy { it.id.componentIdentifier.displayName }

This worked fine with Gradle 6 and Gradle 7.

Current Behavior

Starting with Gradle 8, this code creates an exception when calling configuration.resolvedConfiguration or also configuration.resolve, the stacktrace is:

Caused by: java.lang.NullPointerException: Cannot invoke "org.gradle.internal.component.local.model.RootLocalComponentMetadata$RootLocalConfigurationMetadata.getSyntheticDependencies()" because the return value of "java.util.Map.get(Object)" is null
        at org.gradle.internal.component.local.model.RootLocalComponentMetadata.getSyntheticDependencies(RootLocalComponentMetadata.java:78)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:146)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:144)
        at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:195)
        at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:85)
        at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:76)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:669)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:660)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        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.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:660)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.lambda$resolveExclusively$4(DefaultConfiguration.java:640)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$CalculatedModelValueImpl.update(DefaultProjectStateRegistry.java:486)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveExclusively(DefaultConfiguration.java:637)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:624)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:599)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getResolvedConfiguration(Unknown Source)
        at io.cloudflight.license.gradle.task.LicenseReportTask.resolveCompanionArtifacts(LicenseReportTask.kt:186)
        at io.cloudflight.license.gradle.task.LicenseReportTask.findPomFiles(LicenseReportTask.kt:201)
        at io.cloudflight.license.gradle.task.LicenseReportTask.licenseReport(LicenseReportTask.kt:86)

The impacted lines of code in RootLocalComponentMetadata are:

    @Override
    public BuildableLocalConfigurationMetadata addConfiguration(String name, String description, Set<String> extendsFrom, ImmutableSet<String> hierarchy, boolean visible, boolean transitive, ImmutableAttributes attributes, boolean canBeConsumed, DeprecationMessageBuilder.WithDocumentation consumptionDeprecation, boolean canBeResolved, ImmutableCapabilities capabilities, Supplier<List<DependencyConstraint>> consistentResolutionConstraints) {
        assert hierarchy.contains(name);
        RootLocalConfigurationMetadata conf = new RootLocalConfigurationMetadata(name, description, visible, transitive, extendsFrom, hierarchy, attributes, canBeConsumed, consumptionDeprecation, canBeResolved, capabilities, model, calculatedValueContainerFactory, consistentResolutionConstraints);
        addToConfigurations(name, conf);
        rootConfigs.put(name, conf);
        return conf;
    }

    @Override
    public List<? extends DependencyMetadata> getSyntheticDependencies(String configuration) {
        return rootConfigs.get(configuration).getSyntheticDependencies();
    }

So it seems that somehow the method addConfiguration is not called anymore.

Context

see "Current Behaviour". I tried it both with Gradle 8.0 and Gradle 8.0.1, neither of them are working

Steps to Reproduce

Just use the plugin https://github.com/cloudflightio/license-gradle-plugin with Gradle 8. It works fine with Gradle 7 and 6, and we are not using any deprecated or internal APIs.

@klu2 klu2 added a:regression This used to work to-triage labels Feb 21, 2023
@eskatos eskatos added in:dependency-resolution engine metadata 👋 team-triage Issues that need to be triaged by a specific team and removed to-triage labels Feb 21, 2023
@jvandort jvandort self-assigned this Feb 21, 2023
@jvandort jvandort removed the 👋 team-triage Issues that need to be triaged by a specific team label Feb 22, 2023
@jvandort jvandort added this to the 7.6.1 milestone Feb 22, 2023
bot-gradle added a commit that referenced this issue Feb 23, 2023
… configurations

This ensures when a configuration is removed and added between resolutions, we can clear and subsequently re-calculate updated metadata

Fixes #23985

Co-authored-by: Justin Van Dort <jvandort@gradle.com>
@ljacomet
Copy link
Member

This will be fixed in 7.6.1 and 8.0.2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
a:regression This used to work in:dependency-resolution engine metadata
Projects
None yet
Development

No branches or pull requests

4 participants