I have a rather complex project which pulls together a large number of artifacts from other internal projects. The full dependency graph for this project contains numerous situations where different versions of the same component are referenced throughout the dependency graph.
Here is a simplified dependency graph that illustrates my situation: A --> B --> X (1.0) A --> C --> X (2.0) In this dependency graph, project A depends on components B and C, both of which depend on component X. Components B and C depend on different versions of X. Based on my reading of the "Conflict Resolution" section on [1], Maven will use version 2.0 of X since it is the "best" and "nearest" referenced version in my dependency graph. If my interpretation Maven's dependency conflict resolution is inaccurate, please clarify and/or correct my interpretation. However, if my interpretation is correct, then we have a bigger problem in the project that I'm working on. A more accurate depiction of the dependency graph for this application would look something like this: A --> B --> X (1.0) A --> C --> X (2.0) A --> D --> E --> X (3.0) In this dependency graph, project A still depends on components B and C. Project A also depends on component D which depends on component E, which, in turn, depends on a newer version (3.0) of component X. This dependence on a 'better' version of component X is causing issues for us when we use the MavenProject.getArtifacts() method to retrieve the artifacts for project A. If we use the MavenProject.getArtifacts(), we will end up with an Artifact that references version 2.0 of component X. Based on my reading of the "Conflict Resolution" section on [1], this is due to the fact that the reference to version 2.0 of component X is 'nearer' than the reference to version 3.0 of the same component. It appears that Maven uses the nearest reference to any dependency, and if two references are equi-distant from the project that's being built, then Maven uses the 'best' version that is referenced. In our case, this use of the 'nearest' reference is causing issues at runtime since version 2.0 of component X does not contain the functionality of version 3.0. This causes problems (ClassNotFoundException, NoSuchMethodException) at runtime within component E. What we need in this situation is for Maven to ignore the proximity of a dependency and simply pull in the 'best' version that is referenced, across the entire dependency graph. This situation is causing problems with some custom plugins that we have created. It is also a problem with the dependency plugin since that plugin uses the same MavenProject.getArtifacts() method to build a list of all project dependencies. "Problem" probably isn't the best word choice here. Let's just say that the behavior exhibited by these plugins (both our internal plugins and the dependency plugin) is not what we would like to see. So, here are some questions... Q1. Is there a mechanism within Maven that would provide a list of the the 'best' dependency references within a project's dependency graph? Q2. Is this something that would be useful to the community? (I already have a solution available) Q3. If the answer to Q2 is Yes, then which project should I create a Jira issue for and submit a patch with the mechanism? For reference, all builds are running under Maven 2.2.1. Ron Gallagher [1] http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict +Resolution --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@maven.apache.org For additional commands, e-mail: users-h...@maven.apache.org