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

В чем разница между "Import-Bundle" и "Require-Bundle"?

В чем разница между spring исходным dm-сервером Import-Bundle и OSGi Требовать-Bundle?
Я смущен, следует ли использовать "Импорт-пакет" или "Требовать-пакет" в моем проекте.

4b9b3361

Ответ 1

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

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

 Import-Package               <=> interface
 Import-Bundle/Require-Bundle <=> implementation class

Import-Bundle НЕ OSGi, это проприетарное расширение Spring. Это более чистая форма для Requ-Bundle; нечистота была необходима для поддержки некоторых случаев использования Eclipse. OSGi решила не принимать этот заголовок, потому что требование-Bundle/Import-Bundle принципиально нарушено, если вы хотите создавать системы из компонентов.

Ответ 2

В идеале вам следует скорее использовать Import-Package. Это заставляет вас связывать менее зависимые друг от друга. Это также позволяет показать, что вы зависите только от части пакета. Это также важно для управления версиями. В OSGi вы можете определить версии экспортированных пакетов независимо от версии пакета. Таким образом, вы можете убедиться, что вы изменяете только версии API, если они действительно меняются. Это может сделать ваше приложение более управляемым.

Ответ 3

Здесь объясняется здесь в SpringSource

Итак, суммируя: Import-Bundle импортирует все экспортированные пакеты определенного пакета, он решит это при развертывании, в то время как Require-Bundle действительно требует пакета с этим типом, и это отношение остается таким образом во время выполнения.

Обычно они ведут себя примерно одинаково. Например, это может быть другим, если:

  • У вас есть "разделенные пакеты": пакеты, которые существуют в нескольких пакетах, вы можете "потерять" зависимости с помощью Import-Package/Import-Bundle, которые вы можете выразить только с помощью Require-Bundle (обратите внимание, что вам действительно следует избегать если вы можете),

  • Я думаю, что решение Bundle- > Package - это когда вы развертываете этот пакет. Если вы перераспределите пакет с экспортированными пакетами на версию с различным экспортом, я не думаю, что этот пакет заметит. Честно говоря, я не совсем уверен в этом.

В целом, я бы сказал, придерживайтесь стандарта OSGi: Import-Package или Require-Bundle, если вам это действительно нужно. У вас будет немного больше заголовков, но у вас будет еще много вариантов в конечном итоге.