Using Gradle to find dependency tree
Asked Answered
N

16

826

Is it possible to use Gradle to produce a tree of what depends on what?

I have a project and would like to find out all the dependencies so I may be able to prune it a little with forward declarations etc.

Nonbeliever answered 8/2, 2014 at 10:52 Comment(1)
possible duplicate of what is gradle artifact dependency graph command?Chanson
A
956

Without modules:

gradle dependencies

For Android:

 gradle app:dependencies

Using gradle wrapper:

./gradlew app:dependencies

Note: Replace app with the project module name.

Additionally, if you want to check if something is compile vs. testCompile vs androidTestCompile dependency as well as what is pulling it in:

./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>
Actinochemistry answered 5/2, 2016 at 23:22 Comment(11)
ah, 'app' is a submodule of your current gradle project I guess. Turns out I didn't read this in your answer: "where app is your project module." Thanks for the reply!Meperidine
see also how to achieve that with android studio help developer.android.com/studio/build/…Paradies
@ChadBingham : i try your suggestion but it's didn't work :( #49646603Ollayos
I also didn't know the project module (this legacy project has a really weird structure). But this command helped me ./gradlew -q dependencies :dependencies It looks on all your folders :PGaitskell
In fact ./gradlew :dependencies will work. It will list the dependencies for all your projects, but it is easy to find the right one.Lather
@Jenix it depends on the version of your ./gradlew and gradle are running.If ./gradlew has a higher version it can probably have more tasks.Magistery
On an non-Android project with Gradle wrapper ./gradlew dependencies works (while ./gradlew app:dependencies gives me the following failure / exception "Project 'app' not found in root project 'spring-petclinic'."Worsted
This does not show the dependency tree (transitive dependencies). It just lists out the direct implementations.Baccalaureate
It's not clear how to read this report, what does \--- mean (compared to +---)?Willson
WRT Windows Android Studio, requires JAVA_HOME env var which can be Android Studio's C:\Program Files\Android\Android Studio\jbrSemi
@Worsted It's because app must be replaced with the your project module name (unless you indeed have a module named 'app').Cherilyncherilynn
P
285

You can render the dependency tree with the command gradle dependencies. For more information check the section Listing dependencies in a project in the online user guide.

Paramatta answered 8/2, 2014 at 19:41 Comment(5)
When I do this with my Android project, all I get is this output: pastebin.com/fHFigAuY Suggestions?Pneumatology
@Pneumatology You are probably executing the command in the wrong directory (that doesn't contain the build.gradle file) or your build file doesn't apply any plugin.Paramatta
you can get dependencies for a specific project using gradle :project:dependenciesLisette
Android Studio Plugin - Gradle View to analyse dependencies.Fireweed
If you use the wrapper: ./gradlew dependenciesPekingese
L
219

If you find it hard to navigate console output of gradle dependencies, you can add the Project reports plugin:

apply plugin: 'project-report'

For a multimodule project (most of projects), you need to configure the report to include the subprojects, too:

htmlDependencyReport {
    projects = project.allprojects
}

And generate a HTML report using:

$ ./gradlew htmlDependencyReport

Report can normally be found in build/reports/project/dependencies/index.html

It looks like this: enter image description here

Leviticus answered 21/1, 2017 at 21:22 Comment(7)
For me it was just gradle htmlDependencyReportGag
This doesn't work for multimodule projects. I just see and empty list.Personify
Great find. Plugin actually does way more docs.gradle.org/current/userguide/project_report_plugin.htmlQuintanilla
would be nice if it list are expanded by default to do a quick search. otherwise can go view html on chrome console and search..Chaldron
@lorraine it can create plaintext report, gradle dependencyReportCoprophilia
This is what helped meElectronics
where to add htmlDependencyReport{ projects = project.allprojects } ?Colonic
D
91

In Android Studio (at least since v2.3.3) you can run the command directly from the UI:

Click on the Gradle tab and then double click on :yourmodule -> Tasks -> android -> androidDependencies

The tree will be displayed in the Gradle Console tab

An image is worth a thousand words

Dimity answered 23/6, 2017 at 16:7 Comment(4)
how do i get the "gradle projects" view?Starla
@Starla click on the "gradle" tag found on the right side of your screen. Look at the attached image for referenceApuleius
I found that this creates a flat list in AS 3.2.0, instead of a tree. The command line variant creates a tree however.Vent
@Vent run 'depencies' task under 'help' category not 'android'. It shows as treeDoily
T
62

Often the complete testImplementation, implementation, and androidTestImplementation dependency graph is too much to examine together. If you merely want the implementation dependency graph you can use:

./gradlew app:dependencies --configuration implementation

Source: Listing dependencies in a project

Note: compile has been deprecated in more recent versions of Gradle and in more recent versions you are advised to shift all of your compile dependencies to implementation. Please see this answer here

Triage answered 12/6, 2017 at 9:56 Comment(2)
just a note: compile has been deprecated, people should now move to implementationGoosander
You can also use :dependencies instead of app:dependencies.Innutrition
K
34

For me, it was simply one command

in build.gradle add plugin

apply plugin: 'project-report'

and then go to cmd and run following command

./gradlew htmlDependencyReport

This gives me an HTML report WOW Html report 💕


Or if you want the report in a text file, to make search easy use following command

gradlew dependencyReport

enter image description here

That's all my lord.

Kendall answered 11/3, 2020 at 5:52 Comment(4)
Great answer! Just in case, it is not obvious to someone the generated html file will be found in build/reports/project/dependencies/root.htmlBrazenfaced
Produces an empty tree for a multi-module project.Motorman
@PavelVlasov gradlew dependencyReport this works as charm and give you full dependency treeKendall
Isn't this solution with project-report already answered by devstr ?!Papuan
F
33

If you want to visualize your dependencies in a graph you can use gradle-dependency-graph-generator plugin.

Generally the output of this plugin can be found in build/reports/dependency-graph directory and it contains three files (.dot|.png|.svg) if you are using the 0.5.0 version of the plugin.

Example of dependences graph in a real app (Chess Clock):

graph

Fimbriate answered 9/3, 2018 at 20:38 Comment(3)
Hey David, I did as was told in the plugin instructions. I applied plugin in project gradle but I am not seeing any reports folder in build directory. Is there anything we need to do other than build and run the project?Minatory
This plugin not show dependency version and conflicts. like this for Maven; github.com/janssk1/maven-graph-plugin/wiki/Manual This make it useless..Individually
* What went wrong: Execution failed for task ':generateDependencyGraph'. > Cannot invoke "com.kitfox.svg.SVGDiagram.setIgnoringClipHeuristic(boolean)" because "diagram" is nullEshelman
B
25

Things have moved forward in Gradle so I believe this question merits another answer.
Since Gradle 4.3, "build scans" were introduced. All relevant info is available in the Gradle docs (1, 2). For me, this seems to now be the easiest way to check your dependencies (and generally your build) in a clear, organized way.

They are very easy to create, just execute:

gradle build --scan  

(or ./gradlew build --scan if you use a wrapper)

This produces a randomly generated link where you can see your scan. When opening that link, you enter your email and gain full control of the link: eg. share it or delete it. It has got a lot of info about your build, not just dependencies. You can see your dependencies, their hierarchies, the repository used to obtain them but also a lot of other stuff about your build, namely, its performance (which is of interest in big complex builds), your tests, even your console output and your system configuration, which JDK and JVM was used, max heap size etc.

This is a printscreen from a mock project:

Build scan example

A build scan is a shareable record of a build that provides insights into what happened and why. You can create a build scan at scans.gradle.com for free.

Note however, that info for your build process will be sent to the Gradle servers. You have full control to delete it when you are finished with your inspection.

Finally, you can use build scans with Gradle versions earlier than 4.3 too, you just have to manually add the scans plugin in your buildscript.

Edit:
Incorporating some feedback from the comments some extra notes:
1) It is very difficult to do this by mistake or without understanding that some info for your build will be online (private to you, with the ability to delete it, but still online).

When executing gradle build --scan the following message appears:

Publishing a build scan to scans.gradle.com requires accepting the Gradle
Terms of Service defined at https://gradle.com/terms-of-service. Do you
accept these terms? [yes, no]

You have to explicitly write yes and then the message continues:

Publishing build scan...  
https://gradle.com/s/a12en0dasdu

2) In Gradle Enterprise you can host gradle build scans in your own servers. However I have no experience in this and my proposed approach was about the standard Gradle distribution, using Gradle's servers for your build scans.

3) Gradle itself promotes the build scans as the way to deal with most your build problems.

Borax answered 3/2, 2019 at 10:28 Comment(5)
Sorry to downvote the answer, but IMO it's not answering the question and it's not warning clearly enough that by gradle build --scan you publish details of your build somewhere on internet - and to delete it you have to associate it with working e-mail address.Standstill
Hey Michal, you are welcome to downvote if you feel that way. However I have to ask, did you try it? When executing gradle build --scan in cmd, you are prompted: Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]. You have to manually write yes. Just after that, you get the message: Publishing build scan... https://gradle.com/s/a12en0dasdu (randomly put link of the same type). So I believe it does warn you appropriately before. (1/2)Borax
You can visit the link and delete the scan immediately, without an email or anything. As an answer, I believe it does answer the question. In fact, it shows you extra info about your dependencies (and going the extra mile: extra info for the whole build as well) in comparison to other approaches. If you don't find it to your liking that's totally okay, but it is (to my knowledge) the most comprehensive tool right now for the job, so it's valuable to have it in mind. Finally, it's promoted by Gradle itself, it is literally their first guide (2/2)Borax
@Standstill Sorry, forgot to tag you before so you may have not seen my comments. ( I also edited the post to incorporate the comments with which I answered to you. )Borax
I haven't tried that - thanks for clarifying about the accepting of terms. I removed my -1.Standstill
N
25

For Android, type this in terminal

gradlew app:dependencies

It will list all the dependencies and the ones with newer versions for you to upgrade like

com.android.support:customtabs:26.1.0 -> 27.1.1 (*)
Nanananak answered 13/2, 2019 at 7:44 Comment(2)
No , I'm afraid the part about (*) is wrong. (*) means this dependency declares to use the former(26.1.0) but actually build will use the latter version(27.1.1) this answer talked about this.Agar
@Agar exactly. The OP is wrong.Sofar
B
18

For recent versions of Gradle (I tested with the 6.4.1 version):

gradle dependencies --configuration compileClasspath

or if you're using the Gradle Wrapper:

gradlew dependencies --configuration compileClasspath

When building for Android with the 'debug' and 'release' compilation profiles, the debugCompileClasspath and releaseCompileClasspath configurations can be used instead of compileClasspath.

Baese answered 26/5, 2020 at 19:17 Comment(0)
M
14

I also found useful to run this:

./gradlew dI --dependency <your library>

This shows how are being dependencies resolved (dependencyInsight) and help you debugging into where do you need to force or exclude libraries in your build.gradle

See: https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html

Maestoso answered 24/10, 2017 at 9:16 Comment(1)
i try this like you say but it's didn't work :( #49646603Ollayos
H
11

In Android Studio

1) Open terminal and ensure you are at project's root folder.

2) Run ./gradlew app:dependencies (if not using gradle wrapper, try gradle app:dependencies)

Note that running ./gradle dependencies will only give you dependency tree of project's root folder, so mentioning app in above manner, i.e. ./gradlew app:dependencies is important.

Haustorium answered 9/2, 2017 at 5:46 Comment(1)
for me it worked without the "./" ,like that: gradlew app:dependencies.Puddling
S
8

Note that you may need to do something like ./gradlew <module_directory>:<module_name>:dependencies if the module has extra directory before reach its build.gradle. When in doubt, do ./gradlew tasks --all to check the name.

Siegler answered 8/5, 2018 at 10:30 Comment(0)
P
7

Try either this

./gradlew dependencies > ~/dependencies.txt

or

gradle dependencies > ~/dependencies.txt`

which should write the dependencies in text file under user's home directory.

Passim answered 28/11, 2022 at 21:50 Comment(0)
P
5

If you want all the dependencies in a single file at the end within two steps. Add this to your build.gradle.kts in the root of your project:

project.rootProject.allprojects {
    apply(plugin="project-report")

    this.task("allDependencies", DependencyReportTask::class) {
        evaluationDependsOnChildren()
        this.setRenderer(AsciiDependencyReportRenderer())
    }

}

Then apply:

./gradlew allDependencies | grep '\-\-\-' | grep -Po '\w+.*$' | awk -F ' ' '{ print $1 }' | sort | grep -v '\{' | grep -v '\[' | uniq | grep '.\+:.\+:.\+'

This will give you all the dependencies in your project and sub-projects along with all the 3rd party dependencies.

If you want to get this done in a programmatic way, then you'll need a custom renderer of the dependencies - you can start by extending the AsciiDependencyReportRenderer that prints an ascii graph of the dependencies by default.

Piapiacenza answered 17/11, 2019 at 17:10 Comment(1)
This is interesting, as the first answer which touches on doing it programatically. I've been struggling trying to programatically walk the tree using project.configurations.qdependency.allDependencies.each{} but this doesn't loop over the 3rd party dependencies.Haematoxylin
S
5

double click and run dependency under help in gradle view

enter image description here

Scotticism answered 25/8, 2022 at 19:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.