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] +- com.google.code.gson:gson:jar:2.8.4:compile
[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");
System.out.println(resource);
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:
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-http</artifactId>
<version>${axis2.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</exclusion>
</exclusions>
</dependency>