Я читал, что использование OSGI разделяет classloaders на модуль, который позволяет модулям использовать различные версии своих зависимостей.. одновременно выполняя все модули в той же JVM.
Как это работает? Если модуль, версия № 1 использования зависимости и модуля B использует версию № 2, разве Вы не столкнетесь с проблемой если модуль передачи экземпляр класса зависимости к модулю B как параметр метода?
Я думал бы, что модуль B дросселировал бы, если бы он ожидал другой интерфейс к классу зависимости.
Вы правы, что непоследовательные зависимости могут вызвать проблемы. OSGi избегает этого, вычисляя транзитивное замыкание этих зависимостей и гарантируя, что их нет во время разрешения.
Это позволяет вам раскрыть публичную зависимость, имея при этом внутренние/скрытые частные зависимости, и, как следствие, скрыть ваши зависимости от реализации, чтобы избежать этого. Хорошо то, что все это проверяется во время разрешения Bundle, а не непонятные ошибки во время выполнения.
Конкретно в вашем примере, если A и B используют несовместимый интерфейс, и A зависит от B, то A не сможет разрешиться с ошибкой зависимости. Поэтому он даже не сможет начать передавать ему несовместимый тип.