Пакет хоста не запускается при перезапуске Karaf, когда присутствуют два фрагмента

Я использую Karaf 3.0.1 и имею два пакета фрагментов A и B, которые присоединяются к пакету узла C. Я могу установить A, затем B, затем C и запустить C, и все работает нормально.

Однако, когда я останавливаюсь и запускаю Karaf, у хоста обычно происходит сбой, и он не запускается успешно. Оба фрагмента указаны как «Решено» и отображаются как прикрепленные к хосту, а хост показывает, что он подключен к фрагментам, но хост находится в состоянии «Сбой». Исключением в файле журнала является:

20140507 07:35:39.011 [ERROR] FelixStartLevel | 19:org.apache.aries.blueprint.core |
org.apache.aries.blueprint.container.BlueprintContainerImpl | Unable to start
blueprint container for bundle <host bundle name>
org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to load
class <class from 2nd fragment> from recipe BeanRecipe[name='<bean ID from second
fragment blueprint XML>']

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

Я прочитал Когда фрагмент OSGi прикрепляется к хосту? что кажется, ясно, что начальные уровни не влияют на порядок разрешения, и увидел предложение использовать заголовки Provide/Require-Capability. Я попробовал это и вижу такое же поведение, хотя снова с одним фрагментом все работает нормально.

Что еще я могу сделать, чтобы заставить это работать? Может ли быть ошибка в Karaf/Felix, связанная с несколькими фрагментами для одного и того же хоста при перезапуске?

Да, я бы предпочел не использовать фрагменты, но я переношу довольно сложное приложение Java EE в OSGi, и это подход, который работает с учетом имеющейся у меня кодовой базы, но если я не могу полагаться на то, что вещи запускаются правильно при запуске Karaf, это не будет работать.

Спасибо,

Кевин


person schmke    schedule 07.05.2014    source источник
comment
Я все еще думаю, что начальный уровень поможет, потому что он гарантирует, что фрагмент действительно доступен до пакета хоста.   -  person Achim Nierbeck    schedule 09.05.2014
comment
Коллега попытался воспроизвести мою проблему и смог, только если у него были встроенные банки в пакеты фрагментов. Первый пакет фрагментов загружается нормально, но второй получает ошибку. Он смог обойти это, добавив ‹Embed-Dependency›*;scope=compile|runtime;inline=true‹/Embed-Dependency› в файл pom. В моем случае я пошел дальше и реорганизовал часть кода, чтобы развернуть пакеты A и B в виде обычных пакетов, а не фрагментов. Тем не менее, все еще кажется, что где-то ошибка Феликса.   -  person schmke    schedule 09.05.2014