Вы не видите ошибок, как вы описываете, потому что эта ситуация явно не поддерживается JVM. Он даже не связан с Scala напрямую: он находится на уровне JVM, здесь нет такой вещи, как «библиотеки», есть только плоский путь к классам (до JPMS в любом случае), где имена классов должны быть уникальными.
В общем, такая ситуация должна никогда случиться - вы просто не можете иметь разные классы, имеющие одно и то же полное имя (в основном пакет + имя класса) в одном загрузчике классов (или чаще в пределах одной ветви дерева загрузчиков классов). Если вы это сделаете, то, что происходит, не определено. Это похоже на концепцию «неопределенного поведения» в C / C ++: среда выполнения просто предполагает, что для данного имени может быть только один класс, и может свободно вести себя на основе этого предположения; В зависимости от конфигурации загрузчиков классов, вы можете получить случайный результат, некоторый фиксированный результат, ошибку во время загрузки классов или любую их комбинацию. Вещи становятся еще более забавными , когда у вас есть зависимости, которые, в свою очередь, зависят от разных версий одного и того же класса, что приводит к целому ряду потенциальных исключений во время выполнения.
Это часть очень известная проблема мира JVM, так называемый classpath / JAR hell . По сути, если ваш проект достаточно сложен, чтобы иметь транзитивные или прямые зависимости от разных версий одной и той же библиотеки или, в частности, от одного и того же набора имен классов, вы будете страдать . Количество страданий зависит от сложности вашей ситуации: в некоторых случаях достаточно иметь только одну версию библиотеки в classpath (что может потребовать некоторых настроек в конфигурации сборки); в других случаях вам придется выполнить shading (что является точным способом решения проблемы, с которой вы столкнулись) для определенного подмножества ваших зависимостей. В еще более сложных случаях затенение не будет работать, и вам придется пересмотреть свою архитектуру. В зависимости от вашей среды вам может понадобиться использовать такие инструменты, как OSGi или даже новую Java Platform Module System для решения проблем пути к классам.
Обратите внимание, что с JPMS , эта конкретная ситуация становится немного лучше: у Java модулей по проекту не может быть одного и того же пакета, определенного в нескольких модулях, загруженных одной и той же JVM, поэтому, если вы компилируете свои проекты как надлежащие модули и пытаетесь использовать их в третьем проекте Во время запуска вы получите исключение из-за конфликтующих модулей. При этом у меня нет большого опыта работы с JPMS, поэтому я не могу сказать, как именно он будет работать, особенно с Scala в миксе.