Giter Club home page Giter Club logo

github-dependency-graph-gradle-plugin's Introduction

GitHub Dependency Graph Gradle Plugin

A Gradle plugin for generating a GitHub dependency graph for a Gradle build, which can be uploaded to the GitHub Dependency Submission API.

Usage

This plugin is designed to be used in a GitHub Actions workflow, and is tightly integrated into the gradle/actions/dependency-submission action.

For other uses, the core plugin (org.gradle.github.GitHubDependencyGraphPlugin) should be applied to the Gradle instance via a Gradle init script as follows:

import org.gradle.github.GitHubDependencyGraphPlugin
initscript {
  repositories {
    maven {
      url = uri("https://plugins.gradle.org/m2/")
    }
  }
  dependencies {
    classpath("org.gradle:github-dependency-graph-gradle-plugin:+")
  }
}
apply plugin: GitHubDependencyGraphPlugin

This causes 2 separate plugins to be applied, that can be used independently:

  • GitHubDependencyExtractorPlugin collects all dependencies that are resolved during a build execution and writes these to a file. The output file can be found at <root>/build/reports/github-depenency-graph-snapshots/<job-correlator>.json.
  • ForceDependencyResolutionPlugin creates a ForceDependencyResolutionPlugin_resolveAllDependencies task that will attempt to resolve all dependencies for a Gradle build, by simply invoking dependencies on all projects.

Required environment variables

The following environment variables configure the snapshot generated by the GitHubDependencyExtractorPlugin. See the GitHub Dependency Submission API docs for details:

  • GITHUB_DEPENDENCY_GRAPH_JOB_CORRELATOR: Sets the job.correlator value for the dependency submission
  • GITHUB_DEPENDENCY_GRAPH_JOB_ID: Sets the job.id value for the dependency submission
  • GITHUB_DEPENDENCY_GRAPH_REF: Sets the ref value for the commit that generated the dependency graph
  • GITHUB_DEPENDENCY_GRAPH_SHA: Sets the sha value for the commit that generated the dependency graph
  • GITHUB_DEPENDENCY_GRAPH_WORKSPACE: Sets the root directory of the github repository. Must be an absolute path.
  • DEPENDENCY_GRAPH_REPORT_DIR (optional): Specifies where the dependency graph report will be generated. Must be an absolute path.

Each of these values can also be provided via a system property. eg: Env var DEPENDENCY_GRAPH_REPORT_DIR can be set with -DDEPENDENCY_GRAPH_REPORT_DIR=... on the command-line.

Filtering which Gradle Configurations contribute to the dependency graph

If you do not want to include every dependency configuration in every project in your build, you can limit the dependency extraction to a subset of these.

The following parameters control the set of projects and configurations that contribute dependencies. Each of these is a regular expression value, and can set either as an environment variable or as a system property on the command line.

Property Description Default
DEPENDENCY_GRAPH_INCLUDE_PROJECTS Projects to include All projects are included
DEPENDENCY_GRAPH_EXCLUDE_PROJECTS Projects to exclude No projects are excluded
DEPENDENCY_GRAPH_INCLUDE_CONFIGURATIONS Configurations to include All configurations are included
DEPENDENCY_GRAPH_EXCLUDE_CONFIGURATIONS Configurations to exclude No configurations are excluded

Controlling the scope of dependencies in the dependency graph

The GitHub dependency graph allows a scope to be assigned to each reported dependency. The only permissible values for scope are 'runtime' and 'development'.

The following parameters control the set of projects and configurations that provide 'runtime' scoped dependencies. Any dependency resolution that does not match these parameters will be scoped 'development'.

Each of these parameters is a regular expression value, and can set either as an environment variable or as a system property on the command line.

Property Description Default
DEPENDENCY_GRAPH_RUNTIME_INCLUDE_PROJECTS Projects that can provide 'runtime' dependencies All projects are included
DEPENDENCY_GRAPH_RUNTIME_EXCLUDE_PROJECTS Projects that do not provide 'runtime' dependencies No projects are excluded
DEPENDENCY_GRAPH_RUNTIME_INCLUDE_CONFIGURATIONS Configurations that contain 'runtime' dependencies All configurations are included
DEPENDENCY_GRAPH_RUNTIME_EXCLUDE_CONFIGURATIONS Configurations that do not contain 'runtime' dependencies No configurations are excluded

By default, no scope is assigned to dependencies in the graph. To enable scopes in the generated dependency graph, at least one of these parameters must be configured.

For dependencies that are resolved in multiple projects and/or multiple configurations, only a single 'runtime' scoped resolution is required for that dependency to be scoped 'runtime'.

Gradle compatibility

The plugin should be compatible with most versions of Gradle >= 5.2, and has been tested against Gradle versions "5.2.1", "5.6.4", "6.0.1", "6.9.4", "7.1.1" and "7.6.3", as well as all patched versions of Gradle 8.x.

The plugin is compatible with running Gradle with the configuration-cache enabled: this support is limited to Gradle "8.1.0" and later. Earlier Gradle versions will not work with --configuration-cache. Note that no dependency graph will be generated when configuration state is loaded from the configuration-cache.

Gradle version Compatible Compatible with configuration-cache
1.x - 4.x
5.0 - 5.1.1
5.2 - 5.6.4
6.0 - 6.9.4
7.0 - 7.0.2
7.1 - 7.6.3
8.0 - 8.0.2
8.1+

Dependency verification

When using this plugin with dependency signature verification enabled, the you should be able to update your dependency-verification.xml file using --write-verification-metadata pgp,sha256.

However, if this doesn't work, you can add the following to your dependency-verificaton.xml file:

<trusted-keys>
   <trusted-key id="7B79ADD11F8A779FE90FD3D0893A028475557671" group="org.gradle" name="github-dependency-graph-gradle-plugin"/>
</trusted-keys>

Using the plugin to generate dependency reports

As well as the GitHubDependencyGraphPlugin, which is tailored for use by the gradle/actions/dependency-submission GitHub Action, this repository also provides the SimpleDependencyGraphPlugin, which generates dependency-graph outputs in simple text format.

To use the SimpleDependencyGraphPlugin you'll need to create an init-script.gradle file to apply the plugin to your project:

initscript {
    repositories {
        gradlePluginPortal()
    }
    dependencies {
        classpath "org.gradle:github-dependency-graph-gradle-plugin:+"
    }
}
apply plugin: org.gradle.dependencygraph.simple.SimpleDependencyGraphPlugin

and then execute the task to resolve all dependencies in your project:

./gradlew -I init.gradle --dependency-verification=off --no-configuration-cache --no-configure-on-demand :ForceDependencyResolutionPlugin_resolveAllDependencies

You'll find the generated files in build/dependency-graph-snapshots.

Using dependency reports to determine the underlying source of a dependency

After generating the dependency reports as described, it is possible to determine the dependency source by:

  1. Locate the dependency (including matching version) in the dependency-resolution.json file.
  2. Inspect each resolvedBy entry for the path and configuration values. The scope value is unimportant in this context.
  3. Use the built-in dependencyInsight task to determine exactly how the dependency was resolved. The path indicates the project where the task should be executed, and the configuration is an input to the task.

For example, given the following from the dependency-resolution.json report:

  "dependency" : "com.google.guava:guava:32.1.3-jre",
  "effectiveScope" : "Unknown",
  "resolvedBy" : [ {
    "path" : ":my-subproject",
    "configuration" : "compileClasspath",
    "scope" : "Unknown"
  }, ...

You would run the command:

./gradlew :my-subproject:dependencyInsight --configuration compileClasspath --dependency com.google.guava:guava:32.1.3-jre

Dealing with 'classpath' configuration

If the configuration value in dependency-resolution.json is "classpath", or for some other reason the above instructions do not work, it is possible to recostruct the full resolution path using the generated dependency-graph.json file.

Search for the exact dependency version in dependency-graph.json, and you'll see an "id" entry for that dependency as well as one or more "dependencies" entries. By tracing back through the dependencies you can determine the underlying source of the dependency.

Building/Testing

To build and test this plugin, run the following task:

./gradlew check

To self-test this plugin and generate a dependency graph for this repository, run:

./plugin-self-test-local

The generated dependency graph will be submitted to GitHub only if you supply a GitHub API token via the environment variable GITHUB_TOKEN.

github-dependency-graph-gradle-plugin's People

Contributors

bigdaz avatar dependabot[bot] avatar jlleitschuh avatar simonmarquis avatar sschuberth avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

github-dependency-graph-gradle-plugin's Issues

Plugin application is confusing

I have to apply the GitHubDependencySubmissionPlugin to "gradle" instead of the project, as I would normally expect.

I would expect:

apply plugin: GitHubDependencySubmissionPlugin

But instead I have to do:

project.gradle.apply(plugin: GitHubDependencySubmissionPlugin)

I don't understand why this is built as Plugin<Gradle> instead of Plugin<Project>.

Empty dependency graph snapshot generated when state is loaded from configuration cache

When the Gradle project configuration is successfully loaded from the configuration-cache, no dependencies will be resolved during the build execution. In this case, an empty dependency graph snapshot will be generated.

Submitting this empty snapshot can incorrectly clear the dependency graph for a repository, resolving any security vulnerabilities!

We should either:

  1. Fail if the configuration-cache is enabled when generating a dependency graph snapshot.
  2. Generate a different Job Correlator when configuration-cache state is reused. This would prevent the empty snapshot from overwriting a previous, correct snapshot.
  3. Detect when an empty snapshot is generated due to configuration-cache reuse, and avoid submitting this snapshot (this would require a change in gradle-build-action).

Locked and non-resolving configurations fail with an error in Gradle 7.x with a single project

When using Gradle 7.6.4 with a dependency locking enabled and a single project build, the error Locking strict mode: Configuration ':archives' is locked but does not have lock state. occurs and the build fails. Setting DEPENDENCY_GRAPH_EXCLUDE_CONFIGURATIONS=archives causes the same error to occur but on the :default configuration instead.

Running ./gradlew dependencies shows that both the archives and default configurations are non-resolving. The gradle.lockfile does not include any references to either configuration, likely because they are non-resolving. The problem only occurs in a 'single project build' (e.g. without a settings.gradle file or where the settings.gradle file does not include any valid child projects).

build.zip

Attached is a very simple Gradle project to reproduce the issue:

  1. Install the latest version of Gradle 7.x: gradle wrapper --gradle-version 7.6.4

  2. Generate a lockfile: ./gradlew dependencies --write-locks

    • Notice that 'archives' and 'default' configurations have an (n) after them, indicating they are non-resolving.
    • Notice that the empty= line in gradle.lockfile does not include archives or default on the empty= line. This appears to be correct behavior since they are non-resolving configurations.
  3. Run the github-dependency-graph-gradle-plugin using the command from this repo's README. Alternately, using the GitHub dependency submission action causes the same behavior. ./gradlew -I init.gradle --dependency-verification=off --no-configuration-cache --no-configure-on-demand :ForceDependencyResolutionPlugin_resolveAllDependencies

The following error is returned:

Task :ForceDependencyResolutionPlugin_resolveProjectDependencies FAILED
(omitted)
Execution failed for task ':ForceDependencyResolutionPlugin_resolveProjectDependencies'.
Could not resolve all dependencies for configuration ':archives'.
Locking strict mode: Configuration ':archives' is locked but does not have lock state.

Environment details:

openjdk version "1.8.0_402"
OpenJDK Runtime Environment Corretto-8.402.08.1 (build 1.8.0_402-b08)
OpenJDK 64-Bit Server VM Corretto-8.402.08.1 (build 25.402-b08, mixed mode)

Windows 11 Version 23H2 (OS Build 22631.3296)

gradle --version (used to initialize the wrapper, but not used for executing the Gradle commands above)
Gradle 8.7
Revision: 650af14d7653aa949fce5e886e685efc9cf97c10

Although this was tested with OpenJDK 8, we observed similar behavior in OpenJDK 17. We've temporarily worked around the issue by including both archives and default in the DEPENDENCY_GRAPH_EXCLUDE_CONFIGURATIONS environment variable, but since we're deploying the Gradle Dependency Submission action throughout the enterprise we'll be encountering a variety of 'single project' Gradle builds that aren't upgraded to 8.x yet.

`ForceDependencyResolutionPlugin` incompatible with Project isolation

The plugin ForceDependencyResolutionPlugin isn't compatible with upcoming project isolation because it registers a root task depending on sub-project tasks.
Instead, a settings plugin should add an outgoing configuration by applying a project plugin to each subproject and add a root plugin consuming the configurations.

Failing output using Gradle 8.6 (or 8.7-20240205001347+0000)

- Plugin class 'org.gradle.forceresolve.ForceDependencyResolutionPlugin': Cannot access project ':day1' from project ':'
- Plugin class 'org.gradle.forceresolve.ForceDependencyResolutionPlugin': Cannot access project ':day2' from project ':'
- Plugin class 'org.gradle.forceresolve.ForceDependencyResolutionPlugin': Cannot access project ':day3' from project ':'

Sample code: https://github.com/hfhbd/advendOfCode
failing build: https://github.com/hfhbd/advendOfCode/actions/runs/7795902785/job/21259617710

Refactor: make integration tests more readable

The current integration tests are not very readable, making it a bit difficult to discern exactly what's being tested.
This can be improved by:

  • Ensuring test names accurately describe what is being tested
  • Extracting verification fixtures so that verification blocks are more concise
  • Removing redundant tests (some tests verify aspects of Gradle dependency resolution that are not the purview of this project)

Incomplete dependency-graph generated on build failure

When the build fails, in most cases a dependency-graph file is still generated. This can result in an incomplete dependency-graph being submitted, which could result in Dependabot Alerts being resolved incorrectly.

By default, the plugin should not generate an incomplete dependency-graph file in these circumstances. Instead, no file should be generated, and a warning emitted.

If it is deemed useful, we could add an opt-in to allow dependency-graph generation on failed builds.

Useful env variables from GitHub Actions

@JLLeitschuh requested that I document (on behalf of GitHub) the environment variables available to all GitHub actions that would be important for the new dependency submission API. I'm pulling these from the docs based on my best understanding and prior art, but in the case of GITHUB_JOB and GITHUB_RUN_NUMBER there may be some reasonable alternatives (see this doc for a more complete list).

Variable Used for
GITHUB_JOB job.name
GITHUB_RUN_NUMBER job.id
GITHUB_TOKEN PAT for submitting the dependencies
GITHUB_REF For the top-level ref key
GITHUB_SHA For the top-level sha key
GITHUB_API_URL The base URL for the submission API

Specify Maven classifiers / types as part of PURLs / metadata

Maven has the concept of a classifier that "distinguishes artifacts that were built from the same POM but differ in content". An example is the struts2-assembly dependency which has "lib", "min-lib" etc. variants that also are ZIPs instead of JARs (see Maven's "type").

As contents between such artifact variants differ, e.g. different vulnerabilities may apply. Also, when trying to use the PURL to construct the exact download location of the artifact for further inspection, that is not possible in this case without knowing about the classifier and type.

PURL already specifies how to map Maven classifier and type to its qualifiers, so it would be nice to have them there. Additionally, maybe a package's metadata object in GitHub's dependency submission API could be used to also list these properties.

Log "github-request-id" response header when interacting with GitHub APIs

This is a nice to have feature, but whenever something goes wrong it's much easier for folks on the GitHub side to diagnose when the GitHub Request ID headers are included (from the response payload).

An example response header is: x-github-request-id: 0400:95BA:46F3B20:48EAE9D:61E1C2BE

We can use that header on our side to easily lookup a collection of different tracing info to help diagnose anything that may have gone awry, it's used throughout our APIs as a common identifier for the incoming call at the production GitHub level as well as throughout dependency graph's own APIs.

Failures during dependency resolution seem to be swallowed

I'm not sure whether it's supposed to be like that, but what I see it that running ./gradlew dependencies on https://github.com/wkl3nk/demo-7 gives

dependencySources
+--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0
+--- org.projectlombok:lombok -> 1.18.32
+--- org.springframework.boot:spring-boot-starter-security -> 3.3.0
+--- org.springframework.boot:spring-boot-starter-web -> 3.3.0
+--- com.fasterxml.jackson.module:jackson-module-kotlin FAILED
\--- org.jetbrains.kotlin:kotlin-reflect:2.0.0
     \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0

So there is a resolution failure in jackson-module-kotlin and inspecting that further with ./gradlew dependencyInsight --dependency jackson-module-kotlin --configuration dependencySources gives:

> Task :dependencyInsight
com.fasterxml.jackson.module:jackson-module-kotlin: (selected by rule) FAILED
   Failures:
      - Could not resolve com.fasterxml.jackson.module:jackson-module-kotlin.
        No matching variant errors are explained in more detail at https://docs.gradle.org/8.8/userguide/variant_model.html#sub:variant-no-match.
          - No matching variant of com.fasterxml.jackson.module:jackson-module-kotlin:2.17.1 was found. The consumer was configured to find sources for use during runtime, packaged as a jar, preferably optimized for standard JVMs, and its dependencies declared externally, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'jvm' but:
              - Variant 'apiElements' declares a component, packaged as a jar, and its dependencies declared externally:
                  - Incompatible because this component declares a library for use during compile-time and the consumer needed documentation for use during runtime
                  - Other compatible attributes:
                      - Doesn't say anything about its target Java environment (preferred optimized for standard JVMs)
                      - Doesn't say anything about org.jetbrains.kotlin.platform.type (required 'jvm')
                      - Doesn't say anything about the documentation type (required sources)
              - Variant 'runtimeElements' declares a component for use during runtime, packaged as a jar, and its dependencies declared externally:
                  - Incompatible because this component declares a library and the consumer needed documentation
                  - Other compatible attributes:
                      - Doesn't say anything about its target Java environment (preferred optimized for standard JVMs)
                      - Doesn't say anything about org.jetbrains.kotlin.platform.type (required 'jvm')
                      - Doesn't say anything about the documentation type (required sources)

However, when running this plugin's ForceDependencyResolutionPlugin_resolveAllDependencies on that project, dependency-graph.json is created just fine without any issues, but jackson-module-kotlin is simply omitted from the dependencySources configuration.

So my questions are:

  • Is there actually a (configuration) issue in that project?
    • If there is an issue in the project, why does ForceDependencyResolutionPlugin_resolveAllDependencies no report it as part of dependency-graph.json?
    • If there is no issue in the project, why does Gradle's dependencies task to report a failure?
  • Given "the consumer needed documentation for use during runtime", who the heck needs documentation at runtime? 🤓

Include JVM version in published Dependency Graph

It's very likely that the version of the JVM used to build the project will match the one used in production.

It would be useful to end-users to report this so they can determine if they are using a JDK with known vulnerabilities

When filtering by configuration, output does not agree with the Gradle `dependencies` task

Thanks for your work on this plugin!

I'm currently trying it out on one of my org's repositories (https://github.com/opencastsoftware/yvette) via the gradle-build-action integration.

I have noticed that if I set DEPENDENCY_GRAPH_INCLUDE_CONFIGURATIONS to runtimeClasspath, I get an empty manifest:

{
  "version" : 0,
  "job" : {
    "id" : "5656962664",
    "correlator" : "update_dependency_graph-submit"
  },
  "sha" : "eba0130d92ab95f6d1550ad9888bf7a834380ed3",
  "ref" : "refs/heads/main",
  "detector" : {
    "name" : "GitHub Dependency Graph Gradle Plugin",
    "version" : "0.2.0",
    "url" : "https://github.com/gradle/github-dependency-graph-gradle-plugin"
  },
  "manifests" : {
    "update_dependency_graph-submit" : {
      "name" : "update_dependency_graph-submit",
      "resolved" : { },
      "file" : {
        "source_location" : "settings.gradle.kts"
      }
    }
  },
  "scanned" : "2023-07-25T12:47:10Z"
}

This does not agree with Gradle's output:

❯ ./gradlew dependencies --configuration runtimeClasspath

> Configure project :
matching ref: BRANCH - main
ref configuration: BRANCH - pattern: .+
  describeTagPattern: v(?<version>.+)
  version: ${describe.tag.version:-0.0.0}-${describe.distance}-${commit.short}-SNAPSHOT

project version: 0.1.0-41-e5a6a57-SNAPSHOT

> Task :dependencies

------------------------------------------------------------
Root project 'yvette' - A diagnostic reporting library for Java
------------------------------------------------------------

runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.fusesource.jansi:jansi:2.4.0
+--- org.apache.commons:commons-lang3:3.12.0
\--- org.apache.commons:commons-text:1.10.0
     \--- org.apache.commons:commons-lang3:3.12.0

It was necessary to set the variable instead to compileClasspath|runtimeClasspath as suggested in gradle/gradle-build-action#803 to see all of my project's dependencies, but it would be much more ideal if dependencies and this plugin could agree about the dependencies of a given configuration.

Plugin doesn't seem to work with projects that use `dependencyResolutionManagement`

Using the init.gradle script

initscript {
    repositories {
        maven {
            url = uri("https://plugins.gradle.org/m2/")
        }
    }

    dependencies {
        classpath("org.gradle:github-dependency-graph-gradle-plugin:1.0.0")
    }
}

apply plugin: org.gradle.dependencygraph.simple.SimpleDependencyGraphPlugin

on https://github.com/nnobelis/GradleTest.git by running

./gradlew -I init.gradle

in the root of the project's working tree creates an empty dependency-graph.json, which seems to be wrong as e.g. ./gradlew :Module1:dependencies lists dependencies.

Can it be that this is due to mavenCentral() exclusively being defined via dependencyResolutionManagement?

Dependency resolution does not take constraint dependency versions into account

Hey all,
I have a small request for advise.

We have a Kotlin project with a build.gradle.kts file in the root and a sub-folder containing another build.gradle.kts file. In that sub-folder file we define dependencies and constraints.

For some reason the generated dependency graph still has the dependency versions which are actually overwritten by the constraints. Is this the expected behavior?

Thanks a lot and have a nice day
👋

Provide a lightweight, generic mechanism to resolve all build dependencies for a project

The current implementation relies on invoking a particular Gradle task or tasks in order to ensure that all project dependencies are resolved. This is both error-prone (it's easy to miss some dependencies) and inefficient (we don't want to have to build the project just to determine the dependencies).

The plugin should provide a lightweight mechanism to resolve as many build dependencies as possible, similar to the way that the --write-verification-metadata switch will resolve all dependencies in order to generate the verification metadata file.

To start with , it's OK if not all dependencies are caught by this mechanism, as the existing "user-specified task" mechanism will not be removed. Over time, we can hope to improve the mechanism to be more comprehensive.

Include Gradle version in generated dependency graph

Unfortunately this isn't so simple, since Gradle isn't a library published to a standard repository.

  • Determine correct PURL to use for Gradle Build Tool itself
  • Update and release dependency-graph plugin that includes Gradle version in generated graph
  • Release gradle/actions using this dependency-graph plugin
  • Ensure that Gradle vulnerabilities are reported based on Gradle version used

Configurations in generated != Configurations Listed in Build Scan

Running the self-test the JSON doesn't match up with the build scan

https://ge.gradle.org/s/byrea6vrsycvy/dependencies?toggled=W1swXV0

Screen Shot 2022-01-14 at 9 09 29 PM

{
  "version" : 0,
  "job" : {
    "id" : "42",
    "name" : "Build"
  },
  "sha" : "2e571c0c2971c19872fc3694ab8af303b910eb01",
  "ref" : "refs/heads/master",
  "detector" : {
    "name" : "Gradle GitHub Dependency Extractor",
    "version" : "0.0.1",
    "url" : "https://github.com/gradle/github-dependency-extractor"
  },
  "manifests" : {
    "Build: :, Project: :plugin, Buildscript Configuration: classpath" : {
      "name" : "Build: :, Project: :plugin, Buildscript Configuration: classpath",
      "resolved" : {
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-util-io",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-native-utils",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-project-model",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-gradle-plugin-api",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-gradle-plugin-model",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-util-klib",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-klib-commonizer-api",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/com.google.code.gson/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/com.google.code.gson/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "com.google.code.gson",
            "module" : "gson",
            "version" : "2.8.6"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/com.google.code.gson/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-tooling-metadata",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/com.google.guava/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/com.google.guava/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "com.google.guava",
            "module" : "failureaccess",
            "version" : "1.0.1"
          }
        },
        "pkg:maven/com.google.guava/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/com.google.guava/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "com.google.guava",
            "module" : "listenablefuture",
            "version" : "9999.0-empty-to-avoid-conflict-with-guava"
          }
        },
        "pkg:maven/com.google.code.findbugs/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/com.google.code.findbugs/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "com.google.code.findbugs",
            "module" : "jsr305",
            "version" : "3.0.2"
          }
        },
        "pkg:maven/org.checkerframework/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.checkerframework/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.checkerframework",
            "module" : "checker-qual",
            "version" : "2.11.1"
          }
        },
        "pkg:maven/com.google.errorprone/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/com.google.errorprone/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "com.google.errorprone",
            "module" : "error_prone_annotations",
            "version" : "2.3.4"
          }
        },
        "pkg:maven/com.google.j2objc/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/com.google.j2objc/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "com.google.j2objc",
            "module" : "j2objc-annotations",
            "version" : "1.3"
          }
        },
        "pkg:maven/com.google.guava/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/com.google.guava/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/com.google.guava/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/com.google.guava/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/com.google.code.findbugs/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.checkerframework/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/com.google.errorprone/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/com.google.j2objc/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "com.google.guava",
            "module" : "guava",
            "version" : "29.0-jre"
          }
        },
        "pkg:maven/de.undercouch/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/de.undercouch/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "de.undercouch",
            "module" : "gradle-download-task",
            "version" : "4.1.1"
          }
        },
        "pkg:maven/com.github.gundy/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/com.github.gundy/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "com.github.gundy",
            "module" : "semver4j",
            "version" : "0.16.4"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-daemon-embeddable",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.intellij.deps/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.intellij.deps/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.jetbrains.intellij.deps",
            "module" : "trove4j",
            "version" : "1.0.20181211"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.intellij.deps/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-compiler-embeddable",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-annotation-processing-gradle",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-android-extensions",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-build-common",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlinx/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlinx/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.jetbrains.kotlinx",
            "module" : "kotlinx-coroutines-core-jvm",
            "version" : "1.5.0"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlinx/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-daemon-client",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlinx/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-compiler-runner",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlinx/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-scripting-common",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-scripting-jvm",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlinx/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlinx/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlinx/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlinx",
            "module" : "kotlinx-coroutines-core",
            "version" : "1.5.0"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlinx/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-scripting-compiler-impl-embeddable",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-scripting-compiler-embeddable",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/com.google.code.gson/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/com.google.guava/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/de.undercouch/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/com.github.gundy/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin",
            "module" : "kotlin-gradle-plugin",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jetbrains.kotlin.jvm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jetbrains.kotlin.jvm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "direct",
          "dependencies" : [ "pkg:maven/org.jetbrains.kotlin/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.jetbrains.kotlin.jvm",
            "module" : "org.jetbrains.kotlin.jvm.gradle.plugin",
            "version" : "1.5.32"
          }
        },
        "pkg:maven/org.jdom/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.jdom/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.jdom",
            "module" : "jdom2",
            "version" : "2.0.6"
          }
        },
        "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.ow2.asm",
            "module" : "asm",
            "version" : "9.2"
          }
        },
        "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.ow2.asm",
            "module" : "asm-tree",
            "version" : "9.2"
          }
        },
        "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.ow2.asm",
            "module" : "asm-analysis",
            "version" : "9.2"
          }
        },
        "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.ow2.asm",
            "module" : "asm-commons",
            "version" : "9.2"
          }
        },
        "pkg:maven/commons-io/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/commons-io/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "commons-io",
            "module" : "commons-io",
            "version" : "2.11.0"
          }
        },
        "pkg:maven/org.apache.ant/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.apache.ant/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.apache.ant",
            "module" : "ant-launcher",
            "version" : "1.10.11"
          }
        },
        "pkg:maven/org.apache.ant/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.apache.ant/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.apache.ant/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.apache.ant",
            "module" : "ant",
            "version" : "1.10.11"
          }
        },
        "pkg:maven/org.codehaus.plexus/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.codehaus.plexus/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.codehaus.plexus",
            "module" : "plexus-utils",
            "version" : "3.4.1"
          }
        },
        "pkg:maven/org.apache.logging.log4j/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.apache.logging.log4j/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.apache.logging.log4j",
            "module" : "log4j-api",
            "version" : "2.17.0"
          }
        },
        "pkg:maven/org.apache.logging.log4j/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.apache.logging.log4j/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "direct",
          "dependencies" : [ "pkg:maven/org.apache.logging.log4j/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "org.apache.logging.log4j",
            "module" : "log4j-core",
            "version" : "2.17.0"
          }
        },
        "pkg:maven/org.vafer/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/org.vafer/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ ],
          "metadata" : {
            "group" : "org.vafer",
            "module" : "jdependency",
            "version" : "2.7.0"
          }
        },
        "pkg:maven/gradle.plugin.com.github.johnrengelman/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/gradle.plugin.com.github.johnrengelman/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "indirect",
          "dependencies" : [ "pkg:maven/org.jdom/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.ow2.asm/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/commons-io/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.apache.ant/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.codehaus.plexus/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.apache.logging.log4j/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2", "pkg:maven/org.vafer/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "gradle.plugin.com.github.johnrengelman",
            "module" : "shadow",
            "version" : "7.1.0"
          }
        },
        "pkg:maven/com.github.johnrengelman.shadow/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" : {
          "purl" : "pkg:maven/com.github.johnrengelman.shadow/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2",
          "relationship" : "direct",
          "dependencies" : [ "pkg:maven/gradle.plugin.com.github.johnrengelman/[email protected]?repository_url=https%3A%2F%2Fplugins.gradle.org%2Fm2" ],
          "metadata" : {
            "group" : "com.github.johnrengelman.shadow",
            "module" : "com.github.johnrengelman.shadow.gradle.plugin",
            "version" : "7.1.0"
          }
        }
      },
      "metadata" : {
        "configuration" : "classpath",
        "build_path" : ":",
        "is_script_configuration" : true,
        "true_project_path" : ":plugin"
      },
      "file" : {
        "source_location" : "plugin/build.gradle.kts"
      }
    },
    "Build: :, Project: :plugin-test, Buildscript Configuration: classpath" : {
      "name" : "Build: :, Project: :plugin-test, Buildscript Configuration: classpath",
      "resolved" : { },
      "metadata" : {
        "configuration" : "classpath",
        "build_path" : ":",
        "is_script_configuration" : true,
        "true_project_path" : ":plugin-test"
      },
      "file" : {
        "source_location" : "plugin-test/build.gradle.kts"
      }
    },
    "Build: :, Project: :, Buildscript Configuration: classpath" : {
      "name" : "Build: :, Project: :, Buildscript Configuration: classpath",
      "resolved" : { },
      "metadata" : {
        "configuration" : "classpath",
        "build_path" : ":",
        "is_script_configuration" : true,
        "true_project_path" : ":"
      },
      "file" : {
        "source_location" : "build.gradle.kts"
      }
    },
    "Build: :, Project: :plugin, Configuration: apiDependenciesMetadata" : {
      "name" : "Build: :, Project: :plugin, Configuration: apiDependenciesMetadata",
      "resolved" : { },
      "metadata" : {
        "project_path" : ":plugin",
        "configuration" : "apiDependenciesMetadata",
        "build_path" : ":",
        "is_script_configuration" : false,
        "true_project_path" : ":plugin"
      },
      "file" : {
        "source_location" : "plugin/build.gradle.kts"
      }
    },
    "Build: :, Project: :plugin, Configuration: annotationProcessor" : {
      "name" : "Build: :, Project: :plugin, Configuration: annotationProcessor",
      "resolved" : { },
      "metadata" : {
        "project_path" : ":plugin",
        "configuration" : "annotationProcessor",
        "build_path" : ":",
        "configuration_description" : "Annotation processors and their dependencies for source set 'main'.",
        "is_script_configuration" : false,
        "true_project_path" : ":plugin"
      },
      "file" : {
        "source_location" : "plugin/build.gradle.kts"
      }
    }
  },
  "scanned" : "2022-01-15T01:59:54Z"
}

Populate a package's `scope` field

While currently GitHub's dependency submission API only supports "runtime" and "development" scopes (which do not map really well to Gradle's configurations) it'd still be useful to have some coarse distinction here. Maybe compileOnly stuff should go to "development", and everything else to "runtime"?

Log each resolved dependency and associated configuration path

Knowing the project(s) and configuration(s) that resolved a dependency is the first step in addressing dependency vulnerabilities. This can be difficult to determine in complex Gradle project. Build Scans and the dependency-resolution report can help, but these are not always the most convenient.

We should enable logging for the plugin that will print each resolved dependency together with the project and configuration that resolved it. A dependency resolved in multiple configurations will be printed multiple times.

crash with "buildOperation.details & finishedEvent.result were unexpected types"

I'm using this plugin through the gradle-build-action in the following way:

      - name: setup Gradle to generate and submit dependency graphs
        uses: gradle/[email protected]
        with:
          dependency-graph: generate-and-submit
      - name: update Gradle SBOM
        working-directory: "android"
        run: ./gradlew assembleRelease --stacktrace
        env:
          DEPENDENCY_GRAPH_INCLUDE_CONFIGURATIONS: releaseRuntimeClasspath

I have this setup in two projects, one is using Gradle 8 and working as expected, but the second project with Gradle 7.6.3 produces the following crash:

* What went wrong:
buildOperation.details & finishedEvent.result were unexpected types

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Exception is:
java.lang.IllegalStateException: buildOperation.details & finishedEvent.result were unexpected types
	at org.gradle.dependencygraph.extractor.DependencyExtractor.finished(DependencyExtractor.kt:362)
	at org.gradle.internal.operations.DefaultBuildOperationListenerManager$ProgressShieldingBuildOperationListener.finished(DefaultBuildOperationListenerManager.java:127)
	at org.gradle.internal.operations.DefaultBuildOperationListenerManager$1.finished(DefaultBuildOperationListenerManager.java:60)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$ListenerAdapter.stop(DefaultBuildOperationExecutor.java:214)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$BuildOperationTrackingListener.stop(DefaultBuildOperationRunner.java:2[43](https://github.com/fjuul/app/actions/runs/6822467152/job/18554548902#step:6:44))
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:73)
	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.initialization.BuildOperationSettingsProcessor.process(BuildOperationSettingsProcessor.java:47)
	at org.gradle.initialization.DefaultSettingsLoader.findSettingsAndLoadIfAppropriate(DefaultSettingsLoader.java:136)
	at org.gradle.initialization.DefaultSettingsLoader.findAndLoadSettings(DefaultSettingsLoader.java:62)
	at org.gradle.initialization.SettingsAttachingSettingsLoader.findAndLoadSettings(SettingsAttachingSettingsLoader.java:34)
	at org.gradle.internal.composite.CommandLineIncludedBuildSettingsLoader.findAndLoadSettings(CommandLineIncludedBuildSettingsLoader.java:34)
	at org.gradle.internal.composite.ChildBuildRegisteringSettingsLoader.findAndLoadSettings(ChildBuildRegisteringSettingsLoader.java:48)
	at org.gradle.internal.composite.CompositeBuildSettingsLoader.findAndLoadSettings(CompositeBuildSettingsLoader.java:35)
	at org.gradle.initialization.InitScriptHandlingSettingsLoader.findAndLoadSettings(InitScriptHandlingSettingsLoader.java:34)
	at org.gradle.initialization.GradlePropertiesHandlingSettingsLoader.findAndLoadSettings(GradlePropertiesHandlingSettingsLoader.java:39)
	at org.gradle.initialization.DefaultSettingsPreparer.prepareSettings(DefaultSettingsPreparer.java:31)
	at org.gradle.initialization.BuildOperationFiringSettingsPreparer$LoadBuild.doLoadBuild(BuildOperationFiringSettingsPreparer.java:62)
	at org.gradle.initialization.BuildOperationFiringSettingsPreparer$LoadBuild.run(BuildOperationFiringSettingsPreparer.java:57)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	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.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.initialization.BuildOperationFiringSettingsPreparer.prepareSettings(BuildOperationFiringSettingsPreparer.java:45)
	at org.gradle.initialization.VintageBuildModelController.lambda$prepareSettings$1(VintageBuildModelController.java:80)
	at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:236)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:235)
	at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$10(StateTransitionController.java:210)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
	at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:206)
	at org.gradle.initialization.VintageBuildModelController.prepareSettings(VintageBuildModelController.java:80)
	at org.gradle.initialization.VintageBuildModelController.prepareToScheduleTasks(VintageBuildModelController.java:70)
	at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$prepareToScheduleTasks$2(DefaultBuildLifecycleController.java:129)
	at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:236)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:235)
	at org.gradle.internal.model.StateTransitionController.lambda$maybeTransition$8(StateTransitionController.java:187)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
	at org.gradle.internal.model.StateTransitionController.maybeTransition(StateTransitionController.java:183)
	at org.gradle.internal.build.DefaultBuildLifecycleController.prepareToScheduleTasks(DefaultBuildLifecycleController.java:127)
	at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.scheduleRequestedTasks(DefaultBuildTreeWorkPreparer.java:36)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$doScheduleAndRunTasks$3(DefaultBuildTreeLifecycleController.java:96)
	at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewWorkGraph(DefaultIncludedBuildTaskGraph.java:109)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.doScheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:95)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$scheduleAndRunTasks$1(DefaultBuildTreeLifecycleController.java:76)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$5(DefaultBuildTreeLifecycleController.java:113)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$5(StateTransitionController.java:166)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:166)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
	at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:166)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:110)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:76)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:71)
	at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:65)
	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:136)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:122)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
	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.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:249)
	at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:109)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
	at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)
	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:52)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:40)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)

==============================================================================

2: Task failed with an exception.
-----------
* What went wrong:
The dependency-graph extractor plugin encountered errors while extracting dependencies. Please report this issue at: https://github.com/gradle/github-dependency-graph-gradle-plugin/issues
> buildOperation.details & finishedEvent.result were unexpected types

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Exception is:
org.gradle.internal.exceptions.DefaultMultiCauseException: The dependency-graph extractor plugin encountered errors while extracting dependencies. Please report this issue at: https://github.com/gradle/github-dependency-graph-gradle-plugin/issues
	at org.gradle.dependencygraph.extractor.DependencyExtractor.close(DependencyExtractor.kt:290)
	at org.gradle.dependencygraph.AbstractDependencyExtractorPlugin$PluginApplicatorStrategy$LegacyPluginApplicatorStrategy$registerExtractorServiceShutdown$1.execute(AbstractDependencyExtractorPlugin.kt:92)
	at org.gradle.dependencygraph.AbstractDependencyExtractorPlugin$PluginApplicatorStrategy$LegacyPluginApplicatorStrategy$registerExtractorServiceShutdown$1.execute(AbstractDependencyExtractorPlugin.kt:69)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:95)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:83)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:83)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:69)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at jdk.proxy1/jdk.proxy1.$Proxy28.buildFinished(Unknown Source)
	at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$finishBuild$7(DefaultBuildLifecycleController.java:197)
	at org.gradle.internal.model.StateTransitionController.lambda$finish$11(StateTransitionController.java:227)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:[44](https://github.com/fjuul/app/actions/runs/6822467152/job/18554548902#step:6:45))
	at org.gradle.internal.model.StateTransitionController.finish(StateTransitionController.java:218)
	at org.gradle.internal.build.DefaultBuildLifecycleController.finishBuild(DefaultBuildLifecycleController.java:185)
	at org.gradle.internal.buildtree.DefaultBuildTreeFinishExecutor.finishBuildTree(DefaultBuildTreeFinishExecutor.java:55)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$5(DefaultBuildTreeLifecycleController.java:118)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$5(StateTransitionController.java:166)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:166)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
	at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:166)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:110)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:76)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:71)
	at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:65)
	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:136)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:122)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
	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.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:249)
	at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:109)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
	at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)
	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:52)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:40)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.IllegalStateException: buildOperation.details & finishedEvent.result were unexpected types
	at org.gradle.dependencygraph.extractor.DependencyExtractor.finished(DependencyExtractor.kt:362)
	at org.gradle.internal.operations.DefaultBuildOperationListenerManager$ProgressShieldingBuildOperationListener.finished(DefaultBuildOperationListenerManager.java:127)
	at org.gradle.internal.operations.DefaultBuildOperationListenerManager$1.finished(DefaultBuildOperationListenerManager.java:60)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$ListenerAdapter.stop(DefaultBuildOperationExecutor.java:214)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$BuildOperationTrackingListener.stop(DefaultBuildOperationRunner.java:243)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:73)
	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.initialization.BuildOperationSettingsProcessor.process(BuildOperationSettingsProcessor.java:47)
	at org.gradle.initialization.DefaultSettingsLoader.findSettingsAndLoadIfAppropriate(DefaultSettingsLoader.java:136)
	at org.gradle.initialization.DefaultSettingsLoader.findAndLoadSettings(DefaultSettingsLoader.java:62)
	at org.gradle.initialization.SettingsAttachingSettingsLoader.findAndLoadSettings(SettingsAttachingSettingsLoader.java:34)
	at org.gradle.internal.composite.CommandLineIncludedBuildSettingsLoader.findAndLoadSettings(CommandLineIncludedBuildSettingsLoader.java:34)
	at org.gradle.internal.composite.ChildBuildRegisteringSettingsLoader.findAndLoadSettings(ChildBuildRegisteringSettingsLoader.java:48)
	at org.gradle.internal.composite.CompositeBuildSettingsLoader.findAndLoadSettings(CompositeBuildSettingsLoader.java:35)
	at org.gradle.initialization.InitScriptHandlingSettingsLoader.findAndLoadSettings(InitScriptHandlingSettingsLoader.java:34)
	at org.gradle.initialization.GradlePropertiesHandlingSettingsLoader.findAndLoadSettings(GradlePropertiesHandlingSettingsLoader.java:39)
	at org.gradle.initialization.DefaultSettingsPreparer.prepareSettings(DefaultSettingsPreparer.java:31)
	at org.gradle.initialization.BuildOperationFiringSettingsPreparer$LoadBuild.doLoadBuild(BuildOperationFiringSettingsPreparer.java:62)
	at org.gradle.initialization.BuildOperationFiringSettingsPreparer$LoadBuild.run(BuildOperationFiringSettingsPreparer.java:57)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	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.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.initialization.BuildOperationFiringSettingsPreparer.prepareSettings(BuildOperationFiringSettingsPreparer.java:[45](https://github.com/fjuul/app/actions/runs/6822467152/job/18554548902#step:6:46))
	at org.gradle.initialization.VintageBuildModelController.lambda$prepareSettings$1(VintageBuildModelController.java:80)
	at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:236)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:235)
	at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$10(StateTransitionController.java:210)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
	at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:206)
	at org.gradle.initialization.VintageBuildModelController.prepareSettings(VintageBuildModelController.java:80)
	at org.gradle.initialization.VintageBuildModelController.prepareToScheduleTasks(VintageBuildModelController.java:70)
	at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$prepareToScheduleTasks$2(DefaultBuildLifecycleController.java:129)
	at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:236)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:235)
	at org.gradle.internal.model.StateTransitionController.lambda$maybeTransition$8(StateTransitionController.java:187)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
	at org.gradle.internal.model.StateTransitionController.maybeTransition(StateTransitionController.java:183)
	at org.gradle.internal.build.DefaultBuildLifecycleController.prepareToScheduleTasks(DefaultBuildLifecycleController.java:127)
	at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.scheduleRequestedTasks(DefaultBuildTreeWorkPreparer.java:36)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$doScheduleAndRunTasks$3(DefaultBuildTreeLifecycleController.java:96)
	at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewWorkGraph(DefaultIncludedBuildTaskGraph.java:109)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.doScheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:95)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$scheduleAndRunTasks$1(DefaultBuildTreeLifecycleController.java:76)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$5(DefaultBuildTreeLifecycleController.java:113)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$5(StateTransitionController.java:166)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:166)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
	at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:166)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:110)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:76)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:71)
	at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:65)
	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:136)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:122)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
	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.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:249)
	at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:109)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
	at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:[46](https://github.com/fjuul/app/actions/runs/6822467152/job/18554548902#step:6:47))
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)
	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:52)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:40)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:[47](https://github.com/fjuul/app/actions/runs/6822467152/job/18554548902#step:6:48))
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:[49]

Any pointers on what I might be doing wrong are appreciated.

Need help?

Hi! I was watching this plugin and it really looks like something that would be very useful to us. How can I contribute to it to get it over the finish line? Do you want/need testers? Coders? Test coders?

Failed to stop service 'gitHubDependencyExtractorService'

I am attempting to use version 3.3.0 in a multi-module project and receive the following exception:

2: Task failed with an exception.

  • What went wrong:
    Failed to stop service 'gitHubDependencyExtractorService'.

The GitHubDependencyGraphPlugin plugin encountered errors while writing the dependency snapshot json file. Please report this issue at: https://github.com/gradle/github-dependency-graph-gradle-plugin/issues

Caused by: org.gradle.api.GradleException: The GitHubDependencyGraphPlugin plugin encountered errors while writing the dependency snapshot json file. Please report this issue at: https://github.com/gradle/github-dependency-graph-gradle-plugin/issues
at org.gradle.github.dependencygraph.internal.DependencyExtractor.close(DependencyExtractor.kt:271)
at org.gradle.api.services.internal.RegisteredBuildServiceProvider.lambda$maybeStop$1(RegisteredBuildServiceProvider.java:168)
... 132 more
Caused by: java.lang.IllegalStateException: The configuration parameter 'GITHUB_JOB_CORRELATOR' must be set: set an environment variable, or use '-DGITHUB_JOB_CORRELATOR=value' on the command-line.
at org.gradle.github.dependencygraph.internal.util.PluginParameters.throwEnvironmentVariableMissingException(PluginParameters.kt:34)
at org.gradle.github.dependencygraph.internal.util.PluginParameters.load(PluginParameters.kt:25)
at org.gradle.github.dependencygraph.internal.util.PluginParameters.load$default(PluginParameters.kt:21)
at org.gradle.github.dependencygraph.internal.DependencyExtractor$gitHubSnapshotParams$2.invoke(DependencyExtractor.kt:55)
at org.gradle.github.dependencygraph.internal.DependencyExtractor$gitHubSnapshotParams$2.invoke(DependencyExtractor.kt:23)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at org.gradle.github.dependencygraph.internal.DependencyExtractor.getGitHubSnapshotParams(DependencyExtractor.kt)
at org.gradle.github.dependencygraph.internal.DependencyExtractor.writeDependencyGraph(DependencyExtractor.kt:242)
at org.gradle.github.dependencygraph.internal.DependencyExtractor.close(DependencyExtractor.kt:269)

Error message on missing required input param prompts user to "Please report this issue"

When using the plugin without the correct environment variables set, the resulting exception looks like:

Caused by: org.gradle.api.GradleException: The GitHubDependencyGraphPlugin plugin encountered errors while writing the dependency snapshot json file. 
Please report this issue at: https://github.com/gradle/github-dependency-graph-gradle-plugin/issues
at org.gradle.github.dependencygraph.internal.DependencyExtractor.close(DependencyExtractor.kt:271)
at org.gradle.api.services.internal.RegisteredBuildServiceProvider.lambda$maybeStop$1(RegisteredBuildServiceProvider.java:168)
... 132 more
Caused by: java.lang.IllegalStateException: The configuration parameter 'GITHUB_JOB_CORRELATOR' must be set: set an environment variable, or use '-DGITHUB_JOB_CORRELATOR=value' on the command-line.

Since this is a user configuration error, the exception should not prompt users to report an issue.

Release a beta

Since GitHub Dependency Graph api came out in beta, please make this plugin available for feedback and future adoption.

Need guidance on how to set up dependency signature verification when using plugin

Recently, several PGP keys have been used to sign plugin artifacts on plugins.gradle.org:

  • Versions < 0.4.1 are signed using PGP key 7B79ADD11F8A779FE90FD3D0893A028475557671
  • Versions 0.4.1 — 1.0.0 are signed using PGP key 314FE82E5A4C5377BCA2EDEC5208812E1E4A6DB0
  • Version 1.0.0 is signed using PGP key 7B79ADD11F8A779FE90FD3D0893A028475557671 again.

Also, this plugin is applied differently than other plugins, and the method of bootstrapping dependency verification file with gradle --write-verification-metadata pgp,sha256 does not work here.

It would be great if there was a paragraph in the README with instructions on how to set up verification metadata file when using this plugin in a project with dependency verification enabled (what should be in verification-metadata.xml?).

Settings script dependencies are not collected

We have no support (and no test coverage) for dependencies added to settings.gradle.kts, which can be specified either through the plugins mechanism or directly via a buildscript block.

These dependencies should be collected and reported in a 'settings' (or 'build') manifest.

All dependencies are assigned to the `settings.gradle.kts` file

Looking at the self-test results, all of the dependencies are being bound to the settings.gradle.kts file instead of binding the dependencies to the respective subproject's build.gradle.kts file.

https://github.com/gradle/github-dependency-graph-gradle-plugin/network/dependencies

For example, search for junit: https://github.com/gradle/github-dependency-graph-gradle-plugin/network/dependencies?q=junit

This dependency could be traced to either of these two locations:

However, neither of these files are linked to in the GitHub UI

Alternate solutions if the GITHUB_ vars do not exist

I know this is designed for a GitHub Actions environment, but I'm curious if we can modify the configuration slightly for other environments.

Today, this plugin will cause a build failure if it's applied without all its expected configuration. I've implemented this as a temporary workaround:

if (System.getenv("GITHUB_WORKSPACE") != null
        && System.getenv("GITHUB_REF") != null
        && System.getenv("GITHUB_SHA") != null
        && System.getenv("GITHUB_JOB") != null
        && System.getenv("GITHUB_RUN_NUMBER") != null) {
    apply plugin: GitHubDependencySubmissionPlugin
}

But this is fairly annoying to check, and it can get out-of-date. I'd like to propose 2 alternatives if the variables do not have values:

  1. Inject known placeholders, such as the name of the variable, into the JSON.
  2. Emit a warning message, don't apply anything, and therefore don't generate the JSON.

Note: I'm willing to PR this but I want to make sure I'm doing what the maintainers would accept.

DependencyExtractorBuildService$Inject cannot be cast to class org.gradle.dependencygraph.extractor.DependencyExtractor

I am attempting to use version 3.3.0 in a multi-module project and receive the following exception:

1: Task failed with an exception.

  • What went wrong:
    class org.gradle.dependencygraph.extractor.DependencyExtractorBuildService$Inject cannot be cast to class org.gradle.dependencygraph.extractor.DependencyExtractor (org.gradle.dependencygraph.extractor.DependencyExtractorBuildService$Inject is in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @6fc31064; org.gradle.dependencygraph.extractor.DependencyExtractor is in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader$InstrumentingVisitableURLClassLoader @3822aaed)

Please let me know if you need more information.

Port to kotlinx-serialization

I'd like to port the Jackson code to kotlinx-serialization, mostly to avoid reflection, but also to have clear annotations on classes that are user for serialization (and thus need special attention when refactoring). before I start, are there any objections to use kotlinx-serialization?

Consider excluding `buildSrc` by default.

From my testing, there seems to be an inconsistency in the way build plugin dependencies are reported, depending on whether they are installed via build scripts under buildSrc vs other build scripts.

Plugins applied in scripts under buildSrc directory are included in the dependency report generated by this project's plugin, including any dependencies the plugins require

vs

Plugins applied in normal build scripts, i.e. not under buildSrc directory, are not included in the dependency report.

The dependencies Gradle task excludes buildSrc by default. Maybe this plugin should also?

Love the work you're doing here!

Andy

Excluded configurations should not be resolved

When a configuration or project is excluded from the dependency graph, we should avoid resolving that configuration altogether. The current implementation merely excludes it from the graph.

Plugin failes with gradle version 8.1.1

The plugin failes with this error message (unfortunately there is no more information in the gradle log output):

* What went wrong:
Failed to stop service 'gitHubDependencyExtractorService'.
> The GitHubDependencyGraphPlugin plugin encountered errors while writing the dependency snapshot json file. Please report this issue at: https://github.com/gradle/github-dependency-graph-gradle-plugin/issues

handleBuildOperationTypeRaw masks failed build operations

The routine handleBuildOperationTypeRaw conflates finishedEvent.result not having the expected type with it being null.

As a result, buildOperation.details & finishedEvent.result were unexpected types is thrown if finishedEvent.failure is non-null, even though nothing was wrong with their types.

Example to reproduce:

Using repository / commit https://github.com/OpenVidu/openvidu-tutorials/tree/0f80b654742f37eed83f2881056643509f646cb6

In directory https://github.com/OpenVidu/openvidu-tutorials/tree/0f80b654742f37eed83f2881056643509f646cb6/openvidu-react-native/android

Run

./gradlew --no-daemon -Dorg.gradle.configureondemand=false -Dorg.gradle.dependency.verification=off -Dorg.gradle.warning.mode=none --init-script /tmp/dep-graph.gradle ForceDependencyResolutionPlugin_resolveAllDependencies --stacktrace -DGITHUB_DEPENDENCY_GRAPH_JOB_CORRELATOR=dep-graph -DGITHUB_DEPENDENCY_GRAPH_JOB_ID=unknown -DGITHUB_DEPENDENCY_GRAPH_SHA=unknown -DGITHUB_DEPENDENCY_GRAPH_REF=unknown -DGITHUB_DEPENDENCY_GRAPH_WORKSPACE=/tmp/openvidu-tutorials/ -DDEPENDENCY_GRAPH_REPORT_DIR=/tmp/output

Result: we get the buildOperation.details & finishedEvent.result were unexpected types message.

However if we patch the routine handleBuildOperationTypeRaw:

diff --git a/plugin/src/main/kotlin/org/gradle/dependencygraph/extractor/DependencyExtractor.kt b/plugin/src/main/kotlin/org/gradle/dependencygraph/extractor/DependencyExtractor.kt
index f47221f..2c3a8ee 100644
--- a/plugin/src/main/kotlin/org/gradle/dependencygraph/extractor/DependencyExtractor.kt
+++ b/plugin/src/main/kotlin/org/gradle/dependencygraph/extractor/DependencyExtractor.kt
@@ -103,10 +103,13 @@ abstract class DependencyExtractor :
         val result: R? = finishEvent.result.let {
             if (it is R) it else null
         }
+        val failure = finishEvent.failure
         if (details == null && result == null) {
             return
+        } else if (details != null && failure != null) {
+            throw failure
         } else if (details == null || result == null) {
-            throw IllegalStateException("buildOperation.details & finishedEvent.result were unexpected types")
+            throw IllegalStateException("buildOperation.details & finishedEvent.result were unexpected types " + buildOperation.details?.javaClass + " / " + finishEvent.result?.javaClass)
         }
         handler(details, result)
     }

Then we get the more informative error: MissingResourceException: Could not read script '/private/tmp/openvidu-tutorials/openvidu-react-native/node_modules/@react-native-community/cli-platform-android/native_modules.gradle' as it does not exist.

Gradle's exception handling here is a bit odd -- for reasons I don't fully understand, if we throw an exception without a cause, like the buildOperation.details & finishedEvent.result were unexpected types message, that seems to replace the exception provided in the FinishEvent, whereas if we throw one with finishEvent.failure as a cause it seems to be replaced by that cause. So I'm not sure exactly what the right answer looks like here, but we (a) shouldn't be complaining about types when there's nothing actually wrong with the types (actually, finishEvent.result was null because finishEvent.failure was defined instead), and (b) it would be useful to somehow expose the real underlying cause of the failure.

Manifest file location may point to non-existent build file

The manifest file location for a build invocation is always set to build file of the root project. In some cases, this file will not exist. Instead, we should use the Settings file location, which will always exist.

Alternatively, we could use the Settings file location only if the root project build file doesn't exist. This would avoid changing the manifest location for most existing manifests: changing the manifest file location results in closing all existing security alerts and opening new ones.

(I think it's ok to change this globally at this early stage of the product, but it's worth considering).

gradle jvm toolchain support

When using gradle jvm toolchain feature the build may produce class files that this plugin is unable to read. For example the https://github.com/etiennestuder/gradle-jooq-plugin plugin supports jvm toolchain, which I set to 21/corretto. When running gradle in Github CI it uses an older java to start the gradle daemon, then the jvm toolchain enabled plugin does its stuff in the target jvm, and then this plugin tries to read the class files which fails.

So I think to reproduce this you would do:

  • java in path of version 17 or something
  • jvm toolchain configured to 21
  • use a plugin that is jvm toolchain aware
  • try to use this plugin, spot the class file version failure

The workaround for CI would be to install java 21 in a previous step, but it would be convenient if the toolchain was respected, this is a plugin living under the gradle umbrella after all.

Publishing on Plugin Portal or Maven Central

Hi team, hope you are doing great!

Do you folks have plans to publish this plugin on Gradle's Plugin Portal or Maven Central?

I bet other Engineers out there would love to see this published too ❤️

Meanwhile, thanks for the great job! 💯

Stale dependencies in Dependency graph

Hi there 👋🏻

Sorry if this is the wrong place, I could not find anything useful anywhere else.

I have a simple Gradle project (not a multi project build) with the following workflow to submit the dependencies:

name: Dependency Submission

on:
  push:
    branches:
      - master

permissions:
  contents: write

jobs:
  dependency-submission:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout sources
        uses: actions/checkout@v4

      - name: Generate and submit dependency graph
        uses: gradle/actions/dependency-submission@v3

I bumped a dependency - spring-boot - from 2.2.2.RELEASE to 2.7.18 but when I look at the dependency graph I still see both version of the dependency, with the same date:

Capture d’écran 2024-04-15 à 18 43 31

When I re-run the action with debug log I can see that:

Both version are found from the cache:

2024-04-15T16:44:59.4590050Z ../../../.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/
2024-04-15T16:44:59.4591587Z ../../../.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/2.2.2.RELEASE/
2024-04-15T16:44:59.4593185Z ../../../.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/2.7.18/

Only the 2.7.18 get logged in Detected dependency:

2024-04-15T16:45:19.4173768Z Detected dependency 'org.springframework.boot:spring-boot-starter-web:2.7.18': project = ':', configuration = 'runtimeClasspath'
2024-04-15T16:45:19.4176213Z Detected dependency 'org.springframework.boot:spring-boot-starter:2.7.18': project = ':', configuration = 'runtimeClasspath'
2024-04-15T16:45:19.4178404Z Detected dependency 'org.springframework.boot:spring-boot:2.7.18': project = ':', configuration = 'runtimeClasspath'

At my level I'm not sure whether the issue reside in the gradle action, or in Github. If you have any pointer I'd be grateful.

SimpleDependencyGraphPlugin does not capture plugin dependencies

Following the example in the readme, when executing the following, plugin/buildscript dependencies are not being captured.

gradle -I init.gradle --no-configuration-cache --no-configure-on-demand :ForceDependencyResolutionPlugin_resolveAllDependencies

It would appear that support for this was added to the GithubDependencyGraphPlugin here.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.