I am working in a team that develops different APIs (Hadoop echosystem, scala programming language, gradle for dependency management and delivery to maven repo).
Some APIs have code dependency between each other, since we are working in different repositories, the APIs are depending on each other using the versions in maven.
This approach leads to some serious version synchronization problems:
API
Ais used by APIsBandC(both usingA v1.0); APIDis usingB,Cso indirectly depending onA(from bothB,C).

If we upgrade toA v2.0, we can find ourselves updatingBto useA v2.0and then updatingDto use the newer version ofB, which causes dependency error because nowDhas two different versions ofA-A v2.0fromBandA v1.0fromC.

This happens because we have no way to synchronize between our API versions and don't have a proper systematically way to manually update all the projects that useAdirectly or indirectly, or even be aware of them (hard task when you have a lot of API projects and dependencies).By developing on
A, we can't check whether it integrates well withB,C,Dwithout manually checking, becauseAshould not be familiar withB,C,D.
Sometimes we find out for example thatCis not well compatible with the new version ofA, so now we have to release a hotfix forA.We have no one true source of control over versions between our APIs, It would help if something could automatically say which versions works with each other in an organized manner, like:
'A': 2.0
'B': 1.4
'C': 1.2
'D': 3.0
I know this problem is yelling "use MONOREPO!" (with direct code dependencies), but we would like to manage older versions of some APIs and control when to update them, if we used monorepo in that manner, upgrading A will automatically update B,C,D since now they importing A directly, without any proper independent version management.
Using monorepo with different branches for different versions is also an option, but it will be very hard to manage different versions of different APIs in different branch names since there's no single product with a version we can align to.
We could pack all the different versions in one general API version like example 3, but it's still hard to manage different API versions in a single repo (actually harder to logically pack them together while working in different repos, which is part of my question about how to do it well).
I understand that I have to accept some pros and cons that are given by choosing monorepo/multirepo, so assumine we're staying with multirepo and not complaining about manually upgrade versions for each project and dealing with incompatibility issues, only asking about better approaches to manage different versions across multiple repositories in order to ease some pains which are automatically given by choosing multirepo.
To sum it all, what do you think is the best approach (technically and culturally for a team work) to manage versions across multirepo APIs depending on each other, developed by a single team?