Основная причина в том, что OSGi — это спецификация для системы компонентов многократного использования. Если вы попытаетесь сделать это с транзитивными зависимостями, вы обнаружите, что столкнетесь с проблемами во время сборки:
- конфликты версий — компонент A использует версию 1 X, компонент B использует версию 2 X. Эти конфликты часто сужаются в транзитивных системах, таких как Maven, но бомбы замедленного действия скрываются, чтобы взорваться.
- зависимости от среды — некоторые компоненты зависят от Windows, другие — от Linux. Очень трудно примирить эти различия.
- совместимость версий. Часто компоненты могут работать вместе, но их транзитивные зависимости делают это невозможным.
Чтобы решить эту проблему, OSGi изобрела сервисную модель. Сервисная модель позволяет компоненту зависеть от API. Когда вы зависите от API, у вас больше нет транзитивных зависимостей, поскольку транзитивные зависимости почти полностью связаны с зависимостями реализации. Конечно, существует зависимость от API, но она стала более размытой, поскольку от этого зависят как потребитель API, так и поставщик API. Это в корне меняет модель зависимости в лучшую сторону, но мало кто это понимает.
т.е. в сервисной модели ответственность останавливается на сервисном API. Вы компилируете API, и вы можете написать много тестовых случаев для API. Однако ваш компонент никогда не должен зависеть от конкретной реализации. В первый раз, когда ваш компонент видит реализацию, она должна быть во время выполнения.
Конечно, это лишает некоторых удобств на ранних стадиях разработки. Там, где в транзитивной модели, такой как Maven, все должно компилироваться из коробки, в bnd вам нужно заранее подумать о своих зависимостях и зависимостях вашего компонента. Это неудобно и раздражает пользователей Maven, но необходимо сделать компоненты повторно используемыми в очень разных средах. Maven имеет тенденцию блокировать среду выполнения в часто несовместимых конфигурациях, в OSGi вы не хотите, чтобы среда выполнения имела какие-либо ненужные ограничения для максимального повторного использования ваших компонентов.
Наложение этого ограничения на разработчиков, отсутствие зависимостей от реализации, часто слишком сложно для разработчиков, привыкших к краткосрочному удобству транзитивных зависимостей. Однако разработчики, которые используют эту модель, быстро видят, что она открывает новые возможности на более поздних этапах цикла разработки и значительно сокращает объем обслуживания. Даже у меня иногда возникает соблазн пропустить этот уровень косвенности, но каким-то образом, даже при небольшой сложности, я возвращаюсь, потому что модель имеет так много преимуществ на макроуровне.
Я участвовал во многих сложных системах, и практически во всех случаях большая часть сложности исчезает, когда вы убиваете сирены транзитивной зависимости.
person
Peter Kriens
schedule
18.04.2020