Debug dependency conflicts

Some quick tips to help debug a problem with dependencies in a Java project.

Sometimes adding a new dependency to your project can put a mess if this new dependency comes with other sub-dependencies that take the priority on the version you wanted to use.

Find all the dependencies used in your Maven project

You can run: mvn dependency:tree to list a tree of all dependencies of your Maven project.

m4nu56@m4nu56:~/projects/myproject/src$ mvn dependency:tree -Dverbose -Ddetail=true -Dincludes=org.bouncycastle
[INFO] +- org.apache.commons:commons-lang3:jar:3.7:compile
[INFO] +- org.apache.commons:commons-text:jar:1.4:compile
[INFO] +-
[INFO] +- com.lowagie:itext:jar:2.1.7:compile
[INFO] |  +- bouncycastle:bcmail-jdk14:jar:138:compile
[INFO] |  +- bouncycastle:bcprov-jdk14:jar:138:compile
[INFO] |  \- org.bouncycastle:bctsp-jdk14:jar:1.38:compile
[INFO] |     +- org.bouncycastle:bcprov-jdk14:jar:1.38:compile
[INFO] |     \- org.bouncycastle:bcmail-jdk14:jar:1.38:compile

To analyze it more easily you can forward it to a file:

mvn dependency:tree -Dverbose -Ddetail=true > dependency_tree.txt

In extreme cases you can add the -X argument to obtain even more debug information.

Find which jar is running your class

You can add the following to print the jar that is being used to access a class:

ClassLoader classLoader = KeycloakLoginService.class.getClassLoader();
URL resource = classLoader.getResource("org/apache/http/message/BasicLineFormatter.class");

Exclude a sub dependency from one of your maven dependency

If needed you can then intervene on your Maven dependency to exclude the problematic dependency:

← Back to home