@Reference
- аннотация SCR для спецификации времени выполнения сервисного компонента.
Вы должны различать фазу resolution (процесс между установкой пакета и его установкой active ) и подключением сервисных ссылок.
Придерживаясь компонентов SCR - вы можете представить себе два компонента, которые экспортируют (@Service
аннотация) некоторую службу и ссылаются друг на друга (используя @Reference
) - таким образом вы попадаете в тупиковую ситуацию.
Но сценарий, который вы описали, кажется хорошим.
bar
импортирует пакеты из foo
- так что это разрешается после foo. Конечно, если вы устанавливаете пакеты вручную и сначала устанавливаете bar
, а затем foo
, вам необходимо обновить / перезапустить bar
foo
@Reference
s сервисов от bar
- это только означает, что среда выполнения SCR активирует данный компонент SCR в foo
после того, как сервис станет доступным
Karaf, использующий его функции добавляет еще один уровень разрешения (стандартный распознаватель OSGi) для пакетов функций. Так что это всегда лучше, чем устанавливать пакеты вручную (или перетаскивать их все в какой-либо каталог автоматического развертывания).
Также запомни одну вещь. Если каким-либо образом ваш пакет получает заголовок манифеста Import-Service
(или Require-Capability
) (он может быть сгенерирован с помощью maven-bundle-plugin), может произойти сбой разрешения, поскольку службы обычно регистрируются асинхронно позже, после запуска пакета (с использованием чертежа или время выполнения scr). Я лично обычно избавляюсь от этих заголовков, используя эту конфигурацию:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<_removeheaders>Import-Service,Require-Capability</_removeheaders>
...
</instructions>
...