Hello,

I've been using Maven for 10+ years now. It's great and I still prefer it over 
similar tools. Recently I encountered a scenario where it would have been nice 
to be able to simply "override" a dependency. For example by specifying 
_somehow_ that (in my case) commons-logging should be jcl-over-slf4j in the 
entire dependency graph of my project.

Now you might think: "That is what exclusions are for". And I agree to some 
extent. But if I exclude a dependency (maybe just once, maybe many times) and 
add a dependency to my project to replace what I have excluded, this newly 
added dependency violates the convention of only having (direct) dependencies 
you want to program against. But in this case, it is not my intent to use 
commons-logging and since it is not used in my code, some other developer or 
plug-in might consider it redundant or obsolete.

I encountered other dependencies I'd like to override too. Generally speaking: 
Whenever some artifact needs to be replaced by a different one, which has a 
different groupId or artifactId, overrides might come in handy. Consider the 
artifactId jboss-jaxrs-api_2.0_spec and its newer version 
jboss-jaxrs-api_2.1_spec. It has version information encoded into it. This is 
an issue the Maven resolver is not able to handle nor is it designed to handle 
it.

Long story short, I've found a ticket for something like this: 
https://issues.apache.org/jira/browse/MNG-4530
I also started to implement this feature (albeit differently from the suggested 
approach in the ticket):
https://github.com/strohmattenverleger/maven-resolver/tree/MNG-4530
https://github.com/strohmattenverleger/maven/tree/MNG-4530 (requires the 
changes I made to maven-resolver)
https://github.com/strohmattenverleger/maven-MNG-4530-example

If you find the time, please look at what I've implemented so far. In the 
example project you will find the maven-dependency-plugin configured to copy 
the project dependencies. I've spoken to some of my colleagues and they wanted 
me to also look the results of "mvn dependency:tree" which turned out to be as 
expected (commons-logging has been replaced entirely). Please keep in mind, 
that the feature is not finalized - it's more of a PoC.

I would like your opinion on whether this feature would be nice to have and, if 
so, if the approach is the right one. I'm open to suggestions and I'd be happy 
to answer your questions. If you think this feature has what it takes to be 
merged into Maven once it's finished, I'd be willing to invest more time into 
it.

Kind regards,
Enno

Reply via email to