Hi,

I need some advice on how to handle dependency compatibility issues.
E.g., if A => B => C (and A => C directly too), my understanding is
that Maven will allow me to update A to depend on a new version of C,
even though B still depends on the old version.

But what if B is incompatible with the new version of C?

Here are some ways C might be changed:
1. An implementation change (e.g., a function in a .cpp file).
2. An interface change (e.g., class definition in a .h file).
3. A data structure change (e.g., a data member inside a class).

#1 is the kind of change that usually doesn't cause any problems at
all.  A can depend on a new version of C and that doesn't cause any
problems for B.

#2 is the kind of change that (hopefully) will cause a compile or
linker error when building A.  If so, that's fine.  If not, this could
be a serious problem.

#3 is the kind of change that unfortunately will likely not manifest
itself until the middle of runtime, probably with an unexpected
crash!!

An example of #3 is a custom string class.  Suppose I change the
internal structure of the string class to include other data members.
Suppose that the string class is used heavily as parameters and return
values in the interfaces of A and B.  Obviously "very bad things" will
happen if A is using one version of the string class whereas B is
using another.

One way to mitigate #3 in C/C++ projects is to stick with strictly
plain C types (int, char*, etc) in all interfaces.  But suppose we
have way too much code to go back and change that now...

Another example I didn't mention yet is what if C produces dlls and
headers, and some functions are inlined in the headers.  Updating A to
a new version of C means that B would use a mixture of implementation
from C.  It would use the new implementation in C's dlls, but it would
use the old implementation of C's inline functions that got inlined
into B's dlls.

What is the best way to handle all this to avoid serious runtime
issues?  One way I know of is to lock down versions with a range like
[1.0.0.1].  But if my dependency tree is very tall, that means I may
have to spend a lot of effort rebuilding many components when a
low-level component changes.  Since most changes are
implementation-only changes (#1), it would be nice to avoid that most
of the time.

Is it a common practice to solve this problem using version ranges
such as [1.0.0-1.0.1), i.e., 1.0.0.x, and bump the 4th number for
implementation-only changes, and bump the 3rd number for interface or
other breaking changes?  But what if a programmer makes a breaking
change and forgets to update the 3rd number, or they don't even
realize that what they are changing constitutes as a breaking change?
There's nothing you can do to prevent this, right?

Phillip

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@maven.apache.org
For additional commands, e-mail: users-h...@maven.apache.org

Reply via email to