Я использую 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, это не будет работать.
Спасибо,
Кевин