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.
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.
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.
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.
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 } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With