Подтвердить что ты не робот

Когда следует использовать Import-Package и когда я должен использовать Require-Bundle?

OSGi позволяет определять зависимости через Import-Package, который просто соединяет один пакет (экспортируется из любого пакета) и Require-Bundle, который подключается к определенному экспорту названных пакетов.

При создании приложения OSGi с зеленым полем, какой подход следует использовать для представления зависимостей? Большинство пакетов будут внутренними, но будут некоторые зависимости от внешних (open-source) пакетов.

4b9b3361

Ответ 1

Я считаю, что Require-Bundle - это вещь Eclipse (которая теперь сделала ее в спецификации OSGi для размещения Eclipse). "Чистым" способом OSGi является использование Import-Package, поскольку он специально отделяет пакет от поставляемого пакета. Вы должны декларировать зависимости от необходимой вам функциональности (API Java, предоставляемой определенной версией определенного пакета) вместо того, откуда эта функциональность (что не имеет для вас значения). Это сохраняет гибкость композиции пучков.

Аналогия JavaScript. Это похоже на обнаружение того, поддерживает ли веб-браузер определенный API, или выводит из строя строку пользовательского агента, какой вид браузера.

Питер Криенс из OSGi Alliance больше об этом говорит в блог OSGi.

Вероятно, единственным случаем, когда вам нужно использовать Require-Bundle, является разделение пакетов, это пакет, который распространяется по нескольким пакетам. Сплит-пакеты, конечно же, очень обескуражены.

Ответ 2

Использовать пакет импорта по требованию.

Требовать-пакет:

  • указывает явный пакет (и версию) для использования. Если пакет requirde необходимо реорганизовать и пакет переместится в другое место, то иждивенцам потребуются изменения в их MANIFEST.MF
  • предоставляет вам доступ ко всем экспортным пакетам, независимо от того, что они собой представляют, и независимо от того, нужны ли они вам. Если части, которые вам не нужны, имеют свои собственные зависимости, вам понадобятся те, которые будут
  • пакеты могут быть реэкспортированы
  • хотя и не рекомендуется, позволяет использовать разделенные пакеты, т.е. пакет, который распространяется на несколько пакетов
  • может использоваться для не кодовых зависимостей, например: ресурсы, Справка и т.д.

Import-Package:

  • слабое соединение, указывается только пакет (и версия), и время выполнения находит требуемый пакет
  • Фактические реализации могут быть заменены
  • Зависимые пакеты могут перемещаться в разные пакеты владельцем пакета
  • Но требует большего количества метаданных, поддерживаемых (то есть: каждое имя пакета) на более низких уровнях детализации

Ответ 3

Я считаю, что Import-Package дает вам более слабую связь и должен быть предпочтительным. Я использую его при объявлении зависимостей от пакетов, которые у меня нет, таких как slf4j, и я могу поменять реализации по своему желанию. Я использую Require-Bundle, когда зависимость - это то, что я контролирую, например мои собственные пакеты, потому что любое важное изменение могло бы пройти через меня в любом случае.

Ответ 4

Import-Package должен быть лучше, потому что, как уже говорилось, вы можете переместить пакет из одного пакета в другой без изменения существующего клиента MANIFEST.MF

Но...

Существует практическая причина использовать Require-Bundle, если вы используете Eclipse для разработки ваших пакетов:

Eclipse не использует пакеты как единицы разрешения. Он использует связки. То есть, если вы используете один пакет пакета, Eclipse компилирует ваш пакет, не сообщая о каких-либо проблемах с использованием остальных пакетов, не импортированных из этого пакета.

Вы могли бы (вы человек) подумать, что все в порядке и загружать ваш комплект для развертывания, но... ваш пакет сломается во время выполнения.

Я уверен в этом, потому что сегодня эта проблема (для меня!).

Хорошим решением было бы изменить контейнер класса Eclipse, но... если этого не будет сделано... вы могли бы решить избежать таких проблем, требующих пакетов, а не пакетов, уплачивая указанную цену ( нет обратного совместимого кода между пучками).

Ответ 5

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

Требовать-Bundle, с другой стороны, ссылается на один пакет, делая граф зависимостей защищенным от циклов тривиальной проверкой времени сборки. С Require-Bundle гораздо проще создавать слоистую архитектуру с изолированным более низким уровнем абстракции.

Ответ 6

Я не уверен, что использование Import-Package лучше, потому что мое ожидание по умолчанию при работе с пакетом - это работать с соответствующим общедоступным API. По этой причине Require-Bundle имеет больше смысла.