Hi Robert,

You're assuming later versions are backward compatible. That's a dangerous
assumption. If there are conflicting transitive dependencies in your
dependency tree, you should sort them out.
Would you rather have a ClassNotFoundException at runtime, or a build
error? If L requires version 1.0.0 of Z then that is the artifact it
requires. By using 2.0.0 you're essentially substituting a different
artifact in its place.

I'm not clear on the internals, but when you download a JAR, you get the
corresponding pom (often also in the JAR itself). It's not unreasonable for
Maven to require the dependency before it knows what the transitive
dependencies are. How else would it know?

So why are you removing old dependencies? It sounds like a naive attempt at
gaining some efficiency.
If you don't care to use excludes, you could alternatively setup your own
Maven repository and upload the JAR to it with a simplified pom (one with
reduced or no dependencies)

Regards,
Delany

On Wed, 12 Jan 2022 at 16:18, Roberto Simoni <rsimoni....@gmail.com> wrote:

> Thanks Delany, but just for my knowledge, why maven is not able to
> determine that because you are using the newer library, you can avoid
> failure?
> Is it because maven has to download all dependencies before applying the
> resolution of the most recent version?
> Can we then say that "removing old dependencies" should be avoided in order
> to allow maven to work properly?
> Regards
>   R
>
> Il giorno mar 11 gen 2022 alle ore 19:30 Delany <
> delany.middle...@gmail.com>
> ha scritto:
>
> > Hi Robert. Further down that page you can read about exclusions.
> > So you can make X depend on L but with an exclusion:
> >
> > <dependency>
> >   <artifactId>Z</artifactId>
> >   <version>2.0.0</version>
> > </dependency>
> > <dependency>
> >   <artifactId>L</artifactId>
> >   <exclusions>
> >     <exclusion>
> >       <artifactId>Z</artifactId>
> >     </exclusion>
> >   </exclusions>
> > </dependency>
> >
> > Delany
> >
> >
> > On Tue, 11 Jan 2022 at 19:40, Roberto Simoni <rsimoni....@gmail.com>
> > wrote:
> >
> > > Hi everyone, I have a question for you.
> > > In my company, a team decided to remove periodically versions of a
> > > library/application-framework.
> > > So what happens is that every n months we have to update all softwares
> to
> > > the newer versions.
> > >
> > > There is an aspect that I do not understand and I'd like to ask you my
> > > question making an example.
> > > Imagine that the library where versions are removed is called Z.
> > > You have a project X depending on a library L that is using Z, but
> also X
> > > is using Z.
> > > In X we update the version of Z to 2.0.0
> > > In X, the version of L is still using Z 1.0.0 which is removed.
> > >
> > > I though that you could build X anyway, because the most recent version
> > of
> > > Z (while building X) is the 2.0.0, instead it fails because it tries to
> > > resolve Z 1.0.0 while compiling X when it finds that X is using Z 1.0.0
> > >
> > > Is there any reason behind this decision?
> > > Looking at the this page
> > > <
> > >
> >
> https://maven.apache.org/pom.html#dependency-version-requirement-specification
> > > >
> > > page, I though that it was not required to update every lib if it find
> a
> > > most recent version of it.
> > >
> > > Regards
> > >   R
> > >
> >
>

Reply via email to