Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to list all gradle dependencies programmatically?

I know that doing:

gradle dependencies 

Lists the full dependency tree. Now, I'm looking for a way to manipulate that dependencies tree programmatically so that I can print the same hierarchy but in JSON instead of the format the gradle cli uses right now in the console.

Which are the groovy classes I should use to achieve that?

EDITED

I would like to obtain (in JSON) some like this:

"dependencies" : [   {     "groupId" : "com.something",     "artifactId" : "somethingArtifact",     "version" : "1.0",     "dependencies" : [       "groupId" : "com.leaf",       "artifactId" : "standaloneArtifact",       "version" : "2.0",     ]   },   {     "groupId" : "com.leaf",     "artifactId" : "anotherStandaloneArtifact",     "version" : "1.0",     "dependencies" : []   } ] 

As you can see here with this I know which dependency depends on which other dependencies transitively.

like image 516
cSn Avatar asked Apr 10 '16 23:04

cSn


People also ask

How do I list all tasks in Gradle?

To get an overview of all Gradle tasks in our project, we need to run the tasks task. Since Gradle 5.1, we can use the --group option followed by a group name. Gradle will then show all tasks belonging to the group and not the other tasks in the project.

Where are Gradle dependencies cached?

The Gradle dependency cache consists of two storage types located under GRADLE_USER_HOME/caches : A file-based store of downloaded artifacts, including binaries like jars as well as raw downloaded meta-data like POM files and Ivy files.

What is flatDir in Gradle?

flatDir(configureClosure) Adds an configures a repository which will look for dependencies in a number of local directories. flatDir(args) Adds a resolver that looks into a number of directories for artifacts. The artifacts are expected to be located in the root of the specified directories.


1 Answers

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/5d3ccc056b6f056dbf0dddfdf43894b9065a8f94/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   } } 
like image 130
cSn Avatar answered Sep 19 '22 03:09

cSn