Is there a way to list all gradle dependencies programmatically?

后端 未结 3 1086
无人共我
无人共我 2021-01-31 11:05

I know that doing:

gradle dependencies

Lists the full dependency tree. Now, I\'m looking for a way to manipulate that dependencies tree program

相关标签:
3条回答
  • 2021-01-31 11:30

    The easiest would probably be to write your own DependencyReportRenderer implementation and then either configure the existing dependencies task to use it, or define a new task of type DependencyReportTask with your own renderer configured.

    0 讨论(0)
  • 2021-01-31 11:31

    Hi all this is how I ended up archiving what I needed and hopefully will be useful for the rest of you.

    First off I would like to thanks "pczeus" and "Björn Kautler" for their answers which helped me get to this solution.

    So, this is how I solved my problem:

    Given this build.gradle:

    apply plugin:'java'
    
    repositories {
        jcenter()
    }
    
    dependencies {
        compile 'org.javassist:javassist:3.13.0-GA'
        compile 'org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1'
        compile 'org.hibernate:hibernate-core:5.1.0.Final'
        compile 'org.springframework:spring-web:4.2.5.RELEASE'
    }
    

    If you do:

    gradle -b build.gradle dependencies --configuration=compile
    

    You'll get this output in the console:

    :dependencies
    
    ------------------------------------------------------------
    Root project
    ------------------------------------------------------------
    
    compile - Compile classpath for source set 'main'.
    +--- org.javassist:javassist:3.13.0-GA -> 3.20.0-GA
    +--- org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1
    +--- org.hibernate:hibernate-core:5.1.0.Final
    |    +--- org.jboss.logging:jboss-logging:3.3.0.Final
    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
    |    +--- org.javassist:javassist:3.20.0-GA
    |    +--- antlr:antlr:2.7.7
    |    +--- org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1
    |    +--- org.jboss:jandex:2.0.0.Final
    |    +--- com.fasterxml:classmate:1.3.0
    |    +--- dom4j:dom4j:1.6.1
    |    |    \--- xml-apis:xml-apis:1.0.b2
    |    \--- org.hibernate.common:hibernate-commons-annotations:5.0.1.Final
    |         \--- org.jboss.logging:jboss-logging:3.3.0.Final
    \--- org.springframework:spring-web:4.2.5.RELEASE
         +--- org.springframework:spring-aop:4.2.5.RELEASE
         |    +--- aopalliance:aopalliance:1.0
         |    +--- org.springframework:spring-beans:4.2.5.RELEASE
         |    |    \--- org.springframework:spring-core:4.2.5.RELEASE
         |    |         \--- commons-logging:commons-logging:1.2
         |    \--- org.springframework:spring-core:4.2.5.RELEASE (*)
         +--- org.springframework:spring-beans:4.2.5.RELEASE (*)
         +--- org.springframework:spring-context:4.2.5.RELEASE
         |    +--- org.springframework:spring-aop:4.2.5.RELEASE (*)
         |    +--- org.springframework:spring-beans:4.2.5.RELEASE (*)
         |    +--- org.springframework:spring-core:4.2.5.RELEASE (*)
         |    \--- org.springframework:spring-expression:4.2.5.RELEASE
         |         \--- org.springframework:spring-core:4.2.5.RELEASE (*)
         \--- org.springframework:spring-core:4.2.5.RELEASE (*)
    
    (*) - dependencies omitted (listed previously)
    

    What I wanted was to obtained a the same "dependency tree" but in JSON format. So this is the "task" I created for doing that:

    
    task printSolvedDepsTreeInJson {
      doLast {
        def jsonOutput = "["
        configurations.compile.resolvedConfiguration.firstLevelModuleDependencies.each { dep ->
          def addToJson 
          addToJson = { resolvedDep -> 
            jsonOutput += "\n{"
            jsonOutput += "\"groupId\":\"${resolvedDep.module.id.group}\",\"artifactId\":\"${resolvedDep.module.id.name}\",\"version\":\"${resolvedDep.module.id.version}\",\"file\":\"${resolvedDep.getModuleArtifacts()[0].file}\""
            jsonOutput += ",\"dependencies\":["
            if(resolvedDep.children.size()!=0){
              resolvedDep.children.each { childResolvedDep ->
                if(resolvedDep in childResolvedDep.getParents() && childResolvedDep.getConfiguration() == 'compile'){
                  addToJson(childResolvedDep)
                }
              }
              if(jsonOutput[-1] == ','){
                jsonOutput = jsonOutput[0..-2]
              }
            }
            jsonOutput += "]},"
          }
          addToJson(dep)
        }
        if(jsonOutput[-1] == ','){
          jsonOutput = jsonOutput[0..-2]
        }
        jsonOutput += "]"
        println jsonOutput
      }
    }
    

    If you ran this task:

    gradle -b build.gradle printSolvedDepsTreeInJson
    

    You'll get this:

    [
      {
        "groupId": "org.apache.geronimo.specs",
        "artifactId": "geronimo-jta_1.1_spec",
        "version": "1.1.1",
        "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.apache.geronimo.specs/geronimo-jta_1.1_spec/1.1.1/aabab3165b8ea936b9360abbf448459c0d04a5a4/geronimo-jta_1.1_spec-1.1.1.jar",
        "dependencies": []
      },
      {
        "groupId": "org.hibernate",
        "artifactId": "hibernate-core",
        "version": "5.1.0.Final",
        "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.hibernate/hibernate-core/5.1.0.Final/1b5ac619df76cfd67222ca7cddcee6b0a5db8d0c/hibernate-core-5.1.0.Final.jar",
        "dependencies": [
          {
            "groupId": "org.jboss.logging",
            "artifactId": "jboss-logging",
            "version": "3.3.0.Final",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.jboss.logging/jboss-logging/3.3.0.Final/3616bb87707910296e2c195dc016287080bba5af/jboss-logging-3.3.0.Final.jar",
            "dependencies": []
          },
          {
            "groupId": "org.hibernate.javax.persistence",
            "artifactId": "hibernate-jpa-2.1-api",
            "version": "1.0.0.Final",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.hibernate.javax.persistence/hibernate-jpa-2.1-api/1.0.0.Final/5e731d961297e5a07290bfaf3db1fbc8bbbf405a/hibernate-jpa-2.1-api-1.0.0.Final.jar",
            "dependencies": []
          },
          {
            "groupId": "antlr",
            "artifactId": "antlr",
            "version": "2.7.7",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/antlr/antlr/2.7.7/83cd2cd674a217ade95a4bb83a8a14f351f48bd0/antlr-2.7.7.jar",
            "dependencies": []
          },
          {
            "groupId": "org.apache.geronimo.specs",
            "artifactId": "geronimo-jta_1.1_spec",
            "version": "1.1.1",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.apache.geronimo.specs/geronimo-jta_1.1_spec/1.1.1/aabab3165b8ea936b9360abbf448459c0d04a5a4/geronimo-jta_1.1_spec-1.1.1.jar",
            "dependencies": []
          },
          {
            "groupId": "org.jboss",
            "artifactId": "jandex",
            "version": "2.0.0.Final",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.jboss/jandex/2.0.0.Final/3e899258936f94649c777193e1be846387ed54b3/jandex-2.0.0.Final.jar",
            "dependencies": []
          },
          {
            "groupId": "com.fasterxml",
            "artifactId": "classmate",
            "version": "1.3.0",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/com.fasterxml/classmate/1.3.0/183407ff982e9375f1a1c4a51ed0a9307c598fc7/classmate-1.3.0.jar",
            "dependencies": []
          },
          {
            "groupId": "dom4j",
            "artifactId": "dom4j",
            "version": "1.6.1",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/dom4j/dom4j/1.6.1/5d3ccc056b6f056dbf0ffffdfdf43894b9065a8f94/dom4j-1.6.1.jar",
            "dependencies": [
              {
                "groupId": "xml-apis",
                "artifactId": "xml-apis",
                "version": "1.0.b2",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/xml-apis/xml-apis/1.0.b2/3136ca936f64c9d68529f048c2618bd356bf85c9/xml-apis-1.0.b2.jar",
                "dependencies": []
              }]
          },
          {
            "groupId": "org.hibernate.common",
            "artifactId": "hibernate-commons-annotations",
            "version": "5.0.1.Final",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.hibernate.common/hibernate-commons-annotations/5.0.1.Final/71e1cff3fcb20d3b3af4f3363c3ddb24d33c6879/hibernate-commons-annotations-5.0.1.Final.jar",
            "dependencies": [
              {
                "groupId": "org.jboss.logging",
                "artifactId": "jboss-logging",
                "version": "3.3.0.Final",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.jboss.logging/jboss-logging/3.3.0.Final/3616bb87707910296e2c195dc016287080bba5af/jboss-logging-3.3.0.Final.jar",
                "dependencies": []
              }]
          },
          {
            "groupId": "org.javassist",
            "artifactId": "javassist",
            "version": "3.20.0-GA",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.javassist/javassist/3.20.0-GA/a9cbcdfb7e9f86fbc74d3afae65f2248bfbf82a0/javassist-3.20.0-GA.jar",
            "dependencies": []
          }]
      },
      {
        "groupId": "org.springframework",
        "artifactId": "spring-web",
        "version": "4.2.5.RELEASE",
        "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-web/4.2.5.RELEASE/49cd2430884b77172aa81e3fc33ef668ea1dab30/spring-web-4.2.5.RELEASE.jar",
        "dependencies": [
          {
            "groupId": "org.springframework",
            "artifactId": "spring-aop",
            "version": "4.2.5.RELEASE",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/4.2.5.RELEASE/858d6c70909b3ce7e07b59fc936f8ccfcd81c0aa/spring-aop-4.2.5.RELEASE.jar",
            "dependencies": [
              {
                "groupId": "org.springframework",
                "artifactId": "spring-beans",
                "version": "4.2.5.RELEASE",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/4.2.5.RELEASE/fa992ae40f6fc47117282164e0433b71da385e94/spring-beans-4.2.5.RELEASE.jar",
                "dependencies": [
                  {
                    "groupId": "org.springframework",
                    "artifactId": "spring-core",
                    "version": "4.2.5.RELEASE",
                    "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.2.5.RELEASE/251207b29f0f38f61e3495a2f7fb053cf1bfe8c/spring-core-4.2.5.RELEASE.jar",
                    "dependencies": [
                      {
                        "groupId": "commons-logging",
                        "artifactId": "commons-logging",
                        "version": "1.2",
                        "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar",
                        "dependencies": []
                      }]
                  }]
              },
              {
                "groupId": "org.springframework",
                "artifactId": "spring-core",
                "version": "4.2.5.RELEASE",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.2.5.RELEASE/251207b29f0f38f61e3495a2f7fb053cf1bfe8c/spring-core-4.2.5.RELEASE.jar",
                "dependencies": [
                  {
                    "groupId": "commons-logging",
                    "artifactId": "commons-logging",
                    "version": "1.2",
                    "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar",
                    "dependencies": []
                  }]
              },
              {
                "groupId": "aopalliance",
                "artifactId": "aopalliance",
                "version": "1.0",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/aopalliance/aopalliance/1.0/235ba8b489512805ac13a8f9ea77a1ca5ebe3e8/aopalliance-1.0.jar",
                "dependencies": []
              }]
          },
          {
            "groupId": "org.springframework",
            "artifactId": "spring-beans",
            "version": "4.2.5.RELEASE",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/4.2.5.RELEASE/fa992ae40f6fc47117282164e0433b71da385e94/spring-beans-4.2.5.RELEASE.jar",
            "dependencies": [
              {
                "groupId": "org.springframework",
                "artifactId": "spring-core",
                "version": "4.2.5.RELEASE",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.2.5.RELEASE/251207b29f0f38f61e3495a2f7fb053cf1bfe8c/spring-core-4.2.5.RELEASE.jar",
                "dependencies": [
                  {
                    "groupId": "commons-logging",
                    "artifactId": "commons-logging",
                    "version": "1.2",
                    "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar",
                    "dependencies": []
                  }]
              }]
          },
          {
            "groupId": "org.springframework",
            "artifactId": "spring-context",
            "version": "4.2.5.RELEASE",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/4.2.5.RELEASE/a75e18322c7b362fe1daa26a245ae672ec0f3138/spring-context-4.2.5.RELEASE.jar",
            "dependencies": [
              {
                "groupId": "org.springframework",
                "artifactId": "spring-aop",
                "version": "4.2.5.RELEASE",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/4.2.5.RELEASE/858d6c70909b3ce7e07b59fc936f8ccfcd81c0aa/spring-aop-4.2.5.RELEASE.jar",
                "dependencies": [
                  {
                    "groupId": "org.springframework",
                    "artifactId": "spring-beans",
                    "version": "4.2.5.RELEASE",
                    "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/4.2.5.RELEASE/fa992ae40f6fc47117282164e0433b71da385e94/spring-beans-4.2.5.RELEASE.jar",
                    "dependencies": [
                      {
                        "groupId": "org.springframework",
                        "artifactId": "spring-core",
                        "version": "4.2.5.RELEASE",
                        "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.2.5.RELEASE/251207b29f0f38f61e3495a2f7fb053cf1bfe8c/spring-core-4.2.5.RELEASE.jar",
                        "dependencies": [
                          {
                            "groupId": "commons-logging",
                            "artifactId": "commons-logging",
                            "version": "1.2",
                            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar",
                            "dependencies": []
                          }]
                      }]
                  },
                  {
                    "groupId": "org.springframework",
                    "artifactId": "spring-core",
                    "version": "4.2.5.RELEASE",
                    "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.2.5.RELEASE/251207b29f0f38f61e3495a2f7fb053cf1bfe8c/spring-core-4.2.5.RELEASE.jar",
                    "dependencies": [
                      {
                        "groupId": "commons-logging",
                        "artifactId": "commons-logging",
                        "version": "1.2",
                        "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar",
                        "dependencies": []
                      }]
                  },
                  {
                    "groupId": "aopalliance",
                    "artifactId": "aopalliance",
                    "version": "1.0",
                    "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/aopalliance/aopalliance/1.0/235ba8b489512805ac13a8f9ea77a1ca5ebe3e8/aopalliance-1.0.jar",
                    "dependencies": []
                  }]
              },
              {
                "groupId": "org.springframework",
                "artifactId": "spring-beans",
                "version": "4.2.5.RELEASE",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/4.2.5.RELEASE/fa992ae40f6fc47117282164e0433b71da385e94/spring-beans-4.2.5.RELEASE.jar",
                "dependencies": [
                  {
                    "groupId": "org.springframework",
                    "artifactId": "spring-core",
                    "version": "4.2.5.RELEASE",
                    "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.2.5.RELEASE/251207b29f0f38f61e3495a2f7fb053cf1bfe8c/spring-core-4.2.5.RELEASE.jar",
                    "dependencies": [
                      {
                        "groupId": "commons-logging",
                        "artifactId": "commons-logging",
                        "version": "1.2",
                        "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar",
                        "dependencies": []
                      }]
                  }]
              },
              {
                "groupId": "org.springframework",
                "artifactId": "spring-core",
                "version": "4.2.5.RELEASE",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.2.5.RELEASE/251207b29f0f38f61e3495a2f7fb053cf1bfe8c/spring-core-4.2.5.RELEASE.jar",
                "dependencies": [
                  {
                    "groupId": "commons-logging",
                    "artifactId": "commons-logging",
                    "version": "1.2",
                    "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar",
                    "dependencies": []
                  }]
              },
              {
                "groupId": "org.springframework",
                "artifactId": "spring-expression",
                "version": "4.2.5.RELEASE",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/4.2.5.RELEASE/a42bdfb833d0be6c18429aea3fb0fba81f85c6e8/spring-expression-4.2.5.RELEASE.jar",
                "dependencies": [
                  {
                    "groupId": "org.springframework",
                    "artifactId": "spring-core",
                    "version": "4.2.5.RELEASE",
                    "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.2.5.RELEASE/251207b29f0f38f61e3495a2f7fb053cf1bfe8c/spring-core-4.2.5.RELEASE.jar",
                    "dependencies": [
                      {
                        "groupId": "commons-logging",
                        "artifactId": "commons-logging",
                        "version": "1.2",
                        "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar",
                        "dependencies": []
                      }]
                  }]
              }]
          },
          {
            "groupId": "org.springframework",
            "artifactId": "spring-core",
            "version": "4.2.5.RELEASE",
            "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.2.5.RELEASE/251207b29f0f38f61e3495a2f7fb053cf1bfe8c/spring-core-4.2.5.RELEASE.jar",
            "dependencies": [
              {
                "groupId": "commons-logging",
                "artifactId": "commons-logging",
                "version": "1.2",
                "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar",
                "dependencies": []
              }]
          }]
      }, 
      {
        "groupId": "org.javassist",
        "artifactId": "javassist",
        "version": "3.20.0-GA",
        "file": "/Users/cgadam/.gradle/caches/modules-2/files-2.1/org.javassist/javassist/3.20.0-GA/a9cbcdfb7e9f86fbc74d3afae65f2248bfbf82a0/javassist-3.20.0-GA.jar",
        "dependencies": []
      }
    ]
    

    Which is the JSON representation of the dependency tree I needed. Now, if you look closer you'll notice that this is not the actual list of dependencies we defined in the build.gradle. This is the RESOLVED dependency tree. This means that some dependencies have changed.

    For example the firstLevel dependency:

    org.javassist:javassist:3.13.0-GA
    

    Has been changed for:

    org.javassist:javassist:3.20.0-GA
    

    As

    org.hibernate:hibernate-core:5.1.0.Final
    

    depends on:

    org.javassist:javassist:3.20.0-GA
    

    which is a higher version than:

    org.javassist:javassist:3.13.0-GA
    

    And Gradle by-default conflict resolution algorithm chooses always the "latest" version.

    Actually this is what:

    +--- org.javassist:javassist:3.13.0-GA -> 3.20.0-GA
    

    Means in the console output. 3.13.0-GA was override by 3.20.0-GA version.

    Now, this is a problem because I'm not getting the actual "dependency tree". I'm getting the "resolved" one.

    I ended up fixing this situation by defining another TASK:

    task printDepsTreeInJson {
      doLast {
        configurations.compile.incoming.getResolutionResult().getAllDependencies().each { depResult  ->
          println "{\"from\":\"" + depResult.getFrom() + "\"," + "\"requested\":\"" + depResult.getRequested() + "\"}"
        }
      }
    }
    

    If you execute this:

    gradle -b build.gradle printDepsTreeInJson
    

    You'll now get this:

    :printDepsTreeInJson
    {"from":"project :","requested":"org.javassist:javassist:3.13.0-GA"}
    {"from":"project :","requested":"org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1"}
    {"from":"project :","requested":"org.hibernate:hibernate-core:5.1.0.Final"}
    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.jboss.logging:jboss-logging:3.3.0.Final"}
    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final"}
    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.javassist:javassist:3.20.0-GA"}
    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"antlr:antlr:2.7.7"}
    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1"}
    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.jboss:jandex:2.0.0.Final"}
    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"com.fasterxml:classmate:1.3.0"}
    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"dom4j:dom4j:1.6.1"}
    {"from":"dom4j:dom4j:1.6.1","requested":"xml-apis:xml-apis:1.0.b2"}
    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.hibernate.common:hibernate-commons-annotations:5.0.1.Final"}
    {"from":"org.hibernate.common:hibernate-commons-annotations:5.0.1.Final","requested":"org.jboss.logging:jboss-logging:3.3.0.Final"}
    {"from":"project :","requested":"org.springframework:spring-web:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-web:4.2.5.RELEASE","requested":"org.springframework:spring-aop:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-aop:4.2.5.RELEASE","requested":"aopalliance:aopalliance:1.0"}
    {"from":"org.springframework:spring-aop:4.2.5.RELEASE","requested":"org.springframework:spring-beans:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-beans:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-core:4.2.5.RELEASE","requested":"commons-logging:commons-logging:1.2"}
    {"from":"org.springframework:spring-aop:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-web:4.2.5.RELEASE","requested":"org.springframework:spring-beans:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-web:4.2.5.RELEASE","requested":"org.springframework:spring-context:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-context:4.2.5.RELEASE","requested":"org.springframework:spring-aop:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-context:4.2.5.RELEASE","requested":"org.springframework:spring-beans:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-context:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-context:4.2.5.RELEASE","requested":"org.springframework:spring-expression:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-expression:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
    {"from":"org.springframework:spring-web:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
    

    This is not the final "dependency tree" (I ended up constructing it using javascript) but it's what you actually need to generate it!

    The "from" is the dependency that requested another dependency and the "requested" is the actual dependency being requested! :)

    If

    "from":"project :"
    

    That means that the dependency is a "first level" dependency. (A root)

    All other dependencies will be like this:

    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.jboss.logging:jboss-logging:3.3.0.Final"}
    

    Notice that I do have now the two

    org.javassist:javassist
    

    Each one associated to the dependency that actually requested it. One is a "first level" dependency:

    {"from":"project :","requested":"org.javassist:javassist:3.13.0-GA"}
    

    and the other one was requested by hibernate:

    {"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.javassist:javassist:3.20.0-GA"}
    

    I was too lazy to generate the dependency tree in JSON in the same task :) But, it's clear that this is the way to go if you, for some reason, need to parse the "original"(former/not solved) dependency tree.

    This is the content of the final build.gradle file in case you want to copy&paste and try it out:

    apply plugin:'java'
    
    repositories {
        jcenter()
    }
    
    dependencies {
        compile 'org.javassist:javassist:3.13.0-GA'
        compile 'org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1'
        compile 'org.hibernate:hibernate-core:5.1.0.Final'
        compile 'org.springframework:spring-web:4.2.5.RELEASE'
    }
    
    task printDepsTreeInJson {
      doLast {
        configurations.compile.incoming.getResolutionResult().getAllDependencies().each { depResult  ->
          println "{\"from\":\"" + depResult.getFrom() + "\"," + "\"requested\":\"" + depResult.getRequested() + "\"}"
        }
      }
    }
    
    task printSolvedDepsTreeInJson {
      doLast {
        def jsonOutput = "["
        configurations.compile.resolvedConfiguration.firstLevelModuleDependencies.each { dep ->
          def addToJson 
          addToJson = { resolvedDep -> 
            jsonOutput += "\n{"
            jsonOutput += "\"groupId\":\"${resolvedDep.module.id.group}\",\"artifactId\":\"${resolvedDep.module.id.name}\",\"version\":\"${resolvedDep.module.id.version}\",\"file\":\"${resolvedDep.getModuleArtifacts()[0].file}\""
            jsonOutput += ",\"dependencies\":["
            if(resolvedDep.children.size()!=0){
              resolvedDep.children.each { childResolvedDep ->
                if(resolvedDep in childResolvedDep.getParents() && childResolvedDep.getConfiguration() == 'compile'){
                  addToJson(childResolvedDep)
                }
              }
              if(jsonOutput[-1] == ','){
                jsonOutput = jsonOutput[0..-2]
              }
            }
            jsonOutput += "]},"
          }
          addToJson(dep)
        }
        if(jsonOutput[-1] == ','){
          jsonOutput = jsonOutput[0..-2]
        }
        jsonOutput += "]"
        println jsonOutput
      }
    }
    
    0 讨论(0)
  • 2021-01-31 11:31

    You could create a task within your Gradle file to iterate over all dependencies and generate the JSON as you see fit. Here is an example task that will pretty print the JSON for you:

    task printDependencies << {
        def json = '"dependencies": ['
    
        configurations.runtime.resolvedConfiguration.resolvedArtifacts.each { artifact ->
            def id = artifact.moduleVersion.id
           // println "group: ${id.group}, name: ${id.name}, version: ${id.version}"
            json += JsonOutput.toJson(id)
        }
    
        json += "]"
        json = JsonOutput.prettyPrint(json)
        println json
    }
    

    With sample output:

    "dependencies": [
        {
            "group": "com.fasterxml.jackson.core",
            "version": "2.6.5",
            "name": "jackson-core",
            "module": {
                "group": "com.fasterxml.jackson.core",
                "name": "jackson-core"
            }
        }{
            "group": "org.springframework",
            "version": "4.2.5.RELEASE",
            "name": "spring-aop",
            "module": {
                "group": "org.springframework",
                "name": "spring-aop"
            }
        }
    ]
    
    0 讨论(0)
提交回复
热议问题