Search code examples
scalamavendependenciessbttransitive-dependency

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.


Solution

  • 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)