Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to solve transitive dependencies version conflicts (scala/sbt)

I have a project with several utility classes. Let's name it Utils. I have a proj1 which depends on Utils. And another proj2 that depends on proj1 and Utils.

The problem is if both proj1 and proj2 depend on different Utils version this will lead to problems.

What's the best solution?

This situation occurs in Scala/SBT projects, but I guess other languages have the same problems.

Edit:

Just to be clear, proj2 is the project that will run, that uses some code from proj1 and Utils.

like image 822
pedrorijo91 Avatar asked Sep 26 '22 03:09

pedrorijo91


2 Answers

This is classic Jar Hell, and it is a problem on any JVM based project not just scala with sbt.

There are 4 common solutions

  1. Get rid of conflict by changing code, consolidate your multiple version dependency into a single dependency.

  2. Shading (as mentioned above by @Sean Viera)

  3. Multiple ClassLoader component architecture like OSGI (as mentioned by @tuxdna)

  4. Run in separate JVMs like a microservice architecture (also mentioned by @tuxdna)

like image 57
David Holbrook Avatar answered Oct 17 '22 13:10

David Holbrook


You have three different projects:

  • Utils
  • proj1 <- depends on Utils v1
  • proj2 <- depends on Utils v2

The only way you can be 100% sure that there are no conflicts between proj1 and proj2 is to run them in isolation.

As soon as you will mix proj1 and proj2 with different versions of Utils on the same classpath, you will end up override one or the other project.

You can achive isolation using:

  • run them in separate JVMs, with appropriate version of Utils
  • run them in same JVM but in different class loaders
like image 1
tuxdna Avatar answered Oct 17 '22 14:10

tuxdna