Le sam. 14 août 2021 à 16:52, Enno Thieleke <enno.thiel...@holisticon.de> a
écrit :

> You are right, the feature is mainly useful for transitive dependencies.
> That's my main motivation anyway.
>
> Consider the following:
> You have a dependency to something that depends on
> org.hibernate.javax.persistence:hibernate-jpa-2.2-api. You yourself or
> another thing you depend on depends on
> jakarta.persistence:jakarta.persistence-api. Both artifacts have pretty
> much the same content. As for your classpath, you only want one of both
> (transitive) dependencies. But Maven will resolve both, because their
> coordinates are different. Here Maven's superpower of selecting the right
> version can't come into play.
>
> As for overrides inside the reactor (no matter the depth), this is mainly
> for providing a consistent result. If overrides affect transitive
> dependencies, they must also affect dependencies inside the reactor, but
> for such overrides a warning should be produced, since they are under your
> control.
>
> I think my example even shows both cases: depending on something you
> override yourself and transitively.
>

Think the question is: do you want to control your dependencies or not. If
you want the only option is an exclude (and you can create a pom
excluding/adding the one you want, kind of superbom for convenience). Using
dependency management is also doable very easily (what we tend to use as of
today in project I think).

Your proposal is about rewriting a pom dynamically which is really an
extension IMHO and proven random with all the spec gav out there
(javax->jakarta migrations prove you must not rely on such behavior, it
leads to conflict if not explicitly done as mentionned which is a "less
worse" solution IMHO).

So back to the point it is already doable and built in, you just propose
another grammar IMHO.


________________________________
> From: Bernd Eckenfels <e...@zusammenkunft.net>
> Sent: Saturday, August 14, 2021 4:31 PM
> To: Maven Developers List <dev@maven.apache.org>
> Subject: Re: Request for Enhancement: Dependency Overrides
>
> I don't really see it convenient at all. If you have to change the source
> anyway, you can also fix the POM, that's much less confusing than having a
> project using technology x but declaring to use technology y.
>
> The only time I see dependency overwrites as somewhat useful if you want
> to replace transitive dependencies with fixed minor updates. This is
> however seldomly needed since maven adjusts version conflicts to the
> closest version anyway.
>
> Gruss
> Bernd
> --
> http://bernd.eckenfels.net
> ________________________________
> Von: Enno Thieleke <enno.thiel...@holisticon.de>
> Gesendet: Saturday, August 14, 2021 3:38:53 PM
> An: Maven Developers List <dev@maven.apache.org>
> Betreff: Re: Request for Enhancement: Dependency Overrides
>
> Hi Bernd,
>
> hopefully I understand you correctly: I'd expect the artifact (and its
> source and javadoc attachment) to change, nothing more. The source would be
> left untouched. It is not the responsibility of the dependency resolution
> mechanism/engine to do anything else.
>
> Just to make sure that we have the same understanding: If I replaced one
> dependency with another one, I would effectively alter the POM to contain
> that other dependency instead of the original. After that Maven would do
> its thing as usual.
>
> Obviously, such a feature should be used carefully: If I replaced
> commons-logging:commons-logging with log4j:log4j, any code referencing code
> from commons-logging would not compile anymore. It's the responsibility of
> the developer to provide a working replacement. But this is fine, if you
> ask me, because if I replaced an artifact by exclusion and added a wrong
> dependency, the issue would be the same - and this is possible today
> already. One could say that an override would be a very, very convenient
> way the exclude and add a dependency.
>
> Kind regards,
> Enno
>
> ________________________________
> From: Bernd Eckenfels <e...@zusammenkunft.net>
> Sent: Saturday, August 14, 2021 2:28 PM
> To: Maven Developers List <dev@maven.apache.org>
> Subject: Re: Request for Enhancement: Dependency Overrides
>
> Would you expect to only replace artifacts or also change the java source
> and class files to actually change the used classes? Your cases are no
> simple drop-in replace compatibility. Therefore I doubt a maven feature to
> do so is any more useful than just blocking the deprecated artifacts.
>
> Gruss
> Bernd
> --
> http://bernd.eckenfels.net
> ________________________________
> Von: Enno Thieleke <enno.thiel...@holisticon.de>
> Gesendet: Saturday, August 14, 2021 1:24:26 PM
> An: Maven Developers List <dev@maven.apache.org>
> Betreff: Re: Request for Enhancement: Dependency Overrides
>
> So, you're saying that I can replace artifact coordinates with
> dependencyManagement.dependencies already? I'm not talking about versions,
> scopes and exclusions, I'm talking about groupIds and artifactIds. My idea
> is, simply put, if artifact commons-logging:commons-logging is found,
> org.slf4j:jcl-over-slf4j is used instead. Or if artifact
> org.hibernate.javax.persistence:hibernate-jpa-2.2-api is found,
> jakarta.persistence:jakarta.persistence-api is used instead. I don't think
> that this is possible with the current version of Maven. If it is, please
> share a link to the docs covering this feature.
>
> Feel free to look at the example I provided. I feel it makes my idea more
> comprehensible.
> 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 (the
> "magic" happens in the parent/root POM)
>
> Also, I don't think implementing this as an extension is the right thing
> to do. If it were to be fully implemented, it'd have to be a core feature
> of Maven and the Maven Resolver. This way the entire user base of Maven
> would benefit from it.
> ________________________________
> From: Romain Manni-Bucau <rmannibu...@gmail.com>
> Sent: Saturday, August 14, 2021 8:55 AM
> To: Maven Developers List <dev@maven.apache.org>
> Subject: Re: Request for Enhancement: Dependency Overrides
>
> Hmm,
>
>  dependencyManagement.dependencies already does that today.
> My point is mainly we shouldnt have two ways to do the same and even less
> two chained ways to do it.
>
> If you dont like mvn dep graph definition you can already write a mvn
> extension to write it differently so can also be an option, but as of today
> i dont see anything not already smoothly doable.
>
> Le sam. 14 août 2021 à 02:01, Enno Thieleke <enno.thiel...@holisticon.de>
> a
> écrit :
>
> > Hi Romain,
> >
> > the dependencyOverrides element is an addition. While it shares some
> > characteristics, it does not duplicate the dependencyManagement element.
> In
> > fact, it's a part of it. Come to think of it, it may even be ok to
> > locate/place it "next to" the dependencyManagement element, thus making
> it
> > a "standalone thing", but I consider this feature to be a
> > dependencyManagement aspect, which is why I made a sub element of it.
> >
> > I'm not sure if I understand your question correctly: how to override in
> > the override block?
> > If you mean how would a dependencyOverrides element of one POM be merged
> > with an element of another POM, pretty much like a dependencyManagement
> > element - I made sure remove redundant sub elements.
> > If you mean how would an override override another override? Currently
> > processing overrides is just a sequential operation. Let's say the order
> of
> > overrides is as follows (the notation "->" is to be read as "is
> overridden
> > with" or "is replaced by"):
> >
> >   *   X -> Y
> >   *   Y -> Z
> >
> > Here having a dependency X will ultimately result in having Z. And now
> for
> > a different order:
> >
> >   *   Y -> Z
> >   *   X -> Y
> >
> > Here having a dependency X will result in having Y.
> >
> > I think a helpful implementation would raise an error in both cases,
> since
> > having some sort of hyper edge here is questionable.
> >
> > Where I'm definitely not following you is why one would drop the
> > transitiveness of an override block/element. On the contrary: I'd not
> touch
> > transitiveness in any way. If an override brings transitive dependencies
> > where an original didn't, then so be it. That'd actually be desired in my
> > opinion.
> >
> > The final goal of overrides (if you ask me) is to manipulate a dependency
> > graph in a way that is transparent to developers and plugins. If done
> > right, one wouldn't be able to tell the difference between a graph, which
> > is clean from the start, and a graph, which has been altered using
> > overrides.
> >
> > Looking forward to your reply.
> >
> > Kind regards,
> > Enno
> >
> >
> > ________________________________
> > From: Romain Manni-Bucau <rmannibu...@gmail.com>
> > Sent: Friday, August 13, 2021 2:41 PM
> > To: Maven Developers List <dev@maven.apache.org>
> > Subject: Re: Request for Enhancement: Dependency Overrides
> >
> > Hmm, I probably miss a thing but it looks like you just redid
> > dependencyManagement but duplicating it you created a new issue: how to
> > override in the override block?
> > Only neat way I see to handle that is to drop the transitiveness of the
> > override block which would defeat a lot dependency usage so I'm quite
> mixed
> > about this proposal without a more concrete use case.
> >
> > Romain Manni-Bucau
> > @rmannibucau <https://twitter.com/rmannibucau> |  Blog
> > <https://rmannibucau.metawerx.net/> | Old Blog
> > <http://rmannibucau.wordpress.com> | Github <
> > https://github.com/rmannibucau> |
> > LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book
> > <
> >
> https://www.packtpub.com/application-development/java-ee-8-high-performance
> > >
> >
> >
> > Le ven. 13 août 2021 à 12:56, Enno Thieleke <enno.thiel...@holisticon.de
> >
> > a
> > écrit :
> >
> > > Hi Michael,
> > >
> > > thank you for your answer.
> > >
> > > An interesting thought. It never occurred to me that a global exclusion
> > > would help in a similar way, but then again, global excludes aren't a
> > > thing, yet (are they?). I think excluding globally and including a
> > specific
> > > dependency as a replacement is not as clear as having an override
> element
> > > in a POM. The former can simply be read as: "Aha, a global exclusion
> > here"
> > > and "Huh, a runtime dependency there." A good developer would surely
> add
> > a
> > > comment or two to make his/her intention clear. The latter implies the
> > > intention in the very construct that is used.
> > >
> > > Also with global exclusions, when analyzing a (verbose) dependency
> graph,
> > > it wouldn't show excluded dependencies. Sure, this is the expected
> > > behavior, but again, it's not what a proper graph should look like if
> > > overrides/replacements were a thing. If A depends on B and B has been
> > > replaced with C, then I'd expect to see C instead of B or better yet,
> see
> > > that B has been omitted in favor of C.
> > >
> > > While reading the comments of MNG-1977 I found
> > > https://issues.apache.org/jira/browse/MNG-5652 which is a bit more
> like
> > > what I have in mind.
> > >
> > > Since even my proposal is in a very early stage (not to mention the
> code
> > > I've written), I neglected to mention that I also want to make
> overrides
> > be
> > > importable via the "import" scope. This way one can simply import a BOM
> > as
> > > usual and benefit from any dependency cleanups done by others. My
> > > assumption is that providing overrides in a BOM is a somewhat
> "frameworky
> > > thing" (e.g. Spring, Java/Jakarta EE). One example for a use case is my
> > > all-time favorite org.wildfly.bom:wildfly-jakartaee8:20.0.1.Final. It
> > > includes a managed dependency for Hibernate with some exclusions to it.
> > > Now, when using this managed dependency, I must manually add the
> > exclusions
> > > (with the correct coordinates), which are actually missing, hence not
> > > provided via some other coordinate in the graph of said managed
> > Hibernate,
> > > which is somewhat painful.
> > >
> > > In essence, I think global excludes are definitely a good tool to
> have, I
> > > just don't think that they are the right tool when it comes to
> replacing
> > > dependencies in a concise way.
> > >
> > > Please let me know what you think.
> > >
> > > Kind regards,
> > > Enno
> > >
> > >
> > >
> > > ________________________________
> > > From: Michael Osipov <micha...@apache.org>
> > > Sent: Wednesday, August 11, 2021 4:31 PM
> > > To: dev@maven.apache.org <dev@maven.apache.org>
> > > Subject: Re: Request for Enhancement: Dependency Overrides
> > >
> > > Am 2021-08-06 um 17:55 schrieb Enno Thieleke:
> > > > 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.
> > >
> > > Hi Enno,
> > >
> > > I think you request could be/is related to
> > > https://issues.apache.org/jira/browse/MNG-1977.
> > >
> > > You brought up the most common example for this: Commons Logging.
> > > We obviously not only need global excludes, but also global overrides.
> > > But I think global overrides can be achieved somewhat by global
> excludes
> > > and a runtime dependency with a comment above. It is not as elegant as
> > > your proposal, but would ultimately solve the problem with a different
> > > dependency tree.
> > >
> > > M
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
> > > For additional commands, e-mail: dev-h...@maven.apache.org
> > >
> > >
> >
>

Reply via email to