Почему репозитории в модели рабочего пространства bnd не поддерживают транзитивные зависимости? - PullRequest
1 голос
/ 17 апреля 2020

В соответствии с Введение в модель рабочего пространства bnd репозитории определяют и точный набор зависимостей и не поддерживают транзитивные зависимости, поскольку имеют тенденцию создавать ужасные системы OSGi.

Может кто-нибудь предоставить более подробное объяснение (использование конкретных вариантов использования высоко ценится), когда это правда? Я предполагаю, что это в основном связано с правильным списком Import-Package в манифесте. Как должны обрабатываться переходные зависимости? Есть ли способ обеспечить весь необходимый импорт?

Означает ли это, что разработка пакета только для maven (с помощью bnd-maven-plugin или maven-bundle-plugin) более подвержена ошибкам, поскольку maven поддерживает переходные зависимости? Как транзитивные зависимости должны обрабатываться в этом случае?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Основная причина заключается в том, что OSGi является спецификацией для многократно используемого компонента системы. Если вы попытаетесь сделать это с помощью транзитивных зависимостей, вы обнаружите, что вы столкнулись с проблемами во время сборки:

  • версии версий - компонент A использует версию 1 X, компонент B использует версию 2 X. Эти конфликты часто сужаются в переходных системах, таких как Maven, но бомбы замедленного действия скрываются в go.
  • зависимости от окружения - некоторые компоненты зависят от Windows, другие от Linux. Очень трудно примирить эти различия.
  • совместимость версий - часто компоненты могут работать вместе, но их переходные зависимости делают невозможным.

Для решения этой проблемы OSGi изобрела сервисная модель . Модель сервиса позволяет компоненту зависеть от API . Как только вы зависите от API, у вас больше не будет транзитивных зависимостей, так как транзитивные зависимости почти все о зависимостях реализации . Конечно, существует зависимость от API, но она становится нечеткой, поскольку от этого зависят как пользователь API, так и поставщик API. Это в корне меняет модель зависимости в лучшую сторону, но мало кто это делает.

Т.е. в сервисной модели доллар останавливается на сервисном API. Вы компилируете по API и можете написать множество тестов по API. Однако ваш компонент никогда не должен зависеть от конкретной реализации c. Первый раз, когда ваш компонент увидит, что реализация должна быть во время выполнения.

Конечно, это лишается некоторого удобства на ранних стадиях разработки. В тех случаях, когда в транзитивной модели, такой как Maven, все должно компилироваться «из коробки», в bnd вам нужно заранее подумать о ваших и ваших компонентных зависимостях. Это неудобно и раздражает пользователей Maven, но необходимо сделать компоненты многоразовыми в самых разных средах. Maven имеет тенденцию блокировать среду выполнения в часто несовместимых конфигурациях, в OSGi вы не хотите, чтобы среда выполнения имела какие-либо ненужные ограничения, чтобы максимизировать возможность повторного использования ваших компонентов.

Часто это накладывает ограничение на разработчиков, никаких зависимостей реализации. слишком много для разработчиков, привыкших к краткосрочному удобству переходных зависимостей. Тем не менее, разработчики, которые используют эту модель, быстро понимают, что она открывает множество возможностей на более поздних этапах цикла разработки и значительно сокращает объем обслуживания. Даже я иногда испытываю желание пропустить этот уровень косвенности, но каким-то образом, даже при небольшой сложности, я возвращаюсь, потому что модель имеет так много преимуществ на макроуровне.

Я участвовал во многих сложных системах, и практически во всех случаях большая сложность исчезает, когда вы убиваете сирены с транзитивной зависимостью.

0 голосов
/ 17 апреля 2020

В OSGi создание пакетов и сборка приложений - это две разные вещи. При создании пакетов с Maven вы, конечно, используете транзитивные зависимости. Результатом maven-bundle-plugin или bnd-maven-plugin являются записи в jar Manifest. Они определяют такие вещи, как импортированные или экспортированные пакеты. Этот результат не содержит транзитивных зависимостей. Эти пакеты могут использоваться как в модели рабочего пространства, так и в модели Maven.

Сборка приложения - это другой процесс. Там вы создаете настолько сжатый репозиторий, который представляет собой список возможных пакетов для установки. В модели рабочей области вы перечисляете каждый пакет без транзитивных зависимостей. В сборке приложения на основе maven вы определяете хранилище, используя зависимости pom. Там используются транзитивные зависимости.

Причина, по которой транзитивные зависимости не всегда хороши, заключается в том, что зависимости пакета часто не являются зависимостями, которые вы хотите использовать в своем приложении. Таким образом, модель maven может добавлять проблемные пакеты c в репозиторий. Эти зависимости могут затем замедлиться до разрешения используемых пакетов или даже привести к неработающим разрешенным пакетам. К счастью, вы можете исправить это, исключив некоторые из транзитивных зависимостей, используя обычные исключения maven.

В моем личном опыте транзитивные пакеты часто очень полезны для сборки приложения, поскольку вам не нужно перечислять все зависимости вручную. Проблемные случаи c не совсем легко исправить. Поэтому я не согласен с тем, что переходные зависимости не должны использоваться.

...