Maven dependency resolution (conflicted)
Maven can handle both situations without any conflict. Conflicts will exist when two versions of a transitive dependency are required. The ClassNotFoundException
you describe results from the app (or a dependency) attempting to use a class not available in the version of the conflicted dependency that actually gets used.
There are multiple ways to fix the problem.
- Update the versions of the libraries you are using that depend on the conflicted dependency, so that they all depend on the same version version of that dependency
- Declare the conflicted dependency as a direct dependency of your project with the version you want to be included (in the example, the one with the missing class included in it)
- Specify which version of the conflicted dependency that transitive dependencies should use, via the
<dependencyManagement>
section of the POM - Explicitly exclude the unwanted versions of the conflicted dependency from being included with the dependencies that rely on them using an
<exclusion>
The maven way of resolving situations like this is to include a <dependencyManagement>
section in your project's root pom, where you specify which version of which library will be used.
EDIT:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</dependencyManagement>
Now no matter which version of library foo:bar is requested by a dependency, version 1.2.3 will always be used for this project and all sub-projects.
Reference:
- Dependency Management
This is fundamentally not a maven issue, but a java issue. If Project B and Project C needs two incompatible versions of project D, then you can't use them both in Project A.
The Maven way of resolving conflicts like these is unfortunately, as you already know, to choose which ones to exclude.
Using mvn dependency:analyze
and mvn dependency:tree
helps in finding what conflicts you have.