У меня есть два пакета, один из которых является пакетом хоста для двух фрагментов и следующими зависимостями между этими пакетами / фрагментами.

  • Пакет A (импорт B.bpackage, импорт B1.b1package; экспорт A.apackage)
  • Host Bundle B (экспорт B.bpackage)
  • Фрагмент B1 (экспортный пакет B1.b1)
  • Фрагмент B2 (импортная упаковка A.)

В eclipse (я использую кислород, но такая же ошибка на neon3) возникает ошибка, заключающаяся в том, что импорт из A в пакет B1.b1 не может быть разрешен. Я прочитал это, используя строку Eclipse-ExtensibleAPI: true (Страница справки Eclipse) решает эту проблему, сообщая PDE, что фрагменту разрешено экспортировать дополнительные пакеты (во время выполнения фрагментам всегда разрешено делать это, настройка просто информация для PDE)

Но после использования этого параметра eclipse жалуется на цикл в моих зависимостях, который не существует во время выполнения, потому что фрагмент B2 имеет зависимость от пакета A ...

Как правильно решать такие проблемы?

1
tmy 10 Июл 2017 в 14:49

1 ответ

Лучший ответ

Как правильно решать такие проблемы?

С точки зрения OSGi правильнее всего на самом деле полностью разделить типы API (в идеале на отдельные пакеты) и использовать реестр служб OSGi для взаимодействия. Это гарантирует отсутствие циклов в графике зависимостей пакетов и позволяет легко выпускать обновления, зная, что API не изменился. Declarative Services предоставляет простую модель внедрения на основе аннотаций, которую PDE может обработать за вас.

Модель с:

  • Пакет API A (пакет экспорта A.apackage)
  • Пакет API B (экспорт пакетов B.bpackage, B1.b1package)
  • Impl Bundle A (импортирует все три пакета, предоставляет A.apackage.AService)
  • Impl Bundle B (импортирует B.bpackage, предоставляет B.bpackage.BService)
  • Impl Bundle B1 (импортирует пакет B1.b1, предоставляет службу B1.b1pacakge.B1Service)
  • Impl Bundle B2 (импортный пакет A.)

Может работать лучше для вас.

1
Tim Ward 10 Июл 2017 в 16:06