Конфигурация Karaf OSGi выдает ResolutionException: невозможно разрешить root: отсутствует требование [root] osgi.identity;

Я создаю приложение Spring Boot, которое будет работать на Karaf. Я пытаюсь открыть свойства конфигурации проекта в Karaf, чтобы иметь возможность изменять свойства с помощью config:property-set без необходимости повторного развертывания приложения.

Итак, мне удалось настроить функцию karaf для предоставления свойств Karaf, но я пытаюсь создать компонент OSGi, чтобы иметь возможность получать обновления при изменении свойства с помощью config:property-set.

Ошибка, которую я получаю при попытке установить файл .kar, следующая:

[[A2019-05-19T23:09:32,926 | INFO  | pipe-kar:install file:/Users/nikos/development/interlink/thirdParty/osgi-karaf-spring-boot-demo/osgi-spring-boot-demo-features/target/osgi-spring-boot-demo-features-0.0.1-SNAPSHOT.kar | KarServiceImpl                   | 35 - org.apache.karaf.kar.core - 4.1.3 | Added feature repository 'mvn:com.nemesis/osgi-spring-boot-demo-features/0.0.1-SNAPSHOT/xml/features'
2019-05-19T23:09:32,927 | INFO  | pipe-kar:install file:/Users/nikos/development/interlink/thirdParty/osgi-karaf-spring-boot-demo/osgi-spring-boot-demo-features/target/osgi-spring-boot-demo-features-0.0.1-SNAPSHOT.kar | FeaturesServiceImpl              | 9 - org.apache.karaf.features.core - 4.1.3 | Adding features: osgi-spring-boot-demo-feature/[0.0.1.SNAPSHOT,0.0.1.SNAPSHOT]
2019-05-19T23:09:32,995 | WARN  | pipe-kar:install file:/Users/nikos/development/interlink/thirdParty/osgi-karaf-spring-boot-demo/osgi-spring-boot-demo-features/target/osgi-spring-boot-demo-features-0.0.1-SNAPSHOT.kar | KarServiceImpl                   | 35 - org.apache.karaf.kar.core - 4.1.3 | Unable to install Kar feature osgi-spring-boot-demo-feature/0.0.1.SNAPSHOT
org.osgi.service.resolver.ResolutionException: Unable to resolve root: missing requirement [root] osgi.identity; osgi.identity=osgi-spring-boot-demo-feature; type=karaf.feature; version = "[0.0.1.SNAPSHOT,0.0.1.SNAPSHOT]"; filter: = "(&(osgi.identity=osgi-spring-boot-demo-feature)(type=karaf.feature)(version>=0.0.1.SNAPSHOT)(version<=0.0.1.SNAPSHOT))" [caused by: Unable to resolve osgi-spring-boot-demo-feature/0.0.1.SNAPSHOT: missing requirement [osgi-spring-boot-demo-feature/0.0.1.SNAPSHOT] osgi.identity; osgi.identity=com.nemesis.osgi-spring-boot-demo-bundle; type=osgi.bundle; version = "[0.0.1.SNAPSHOT,0.0.1.SNAPSHOT]"; resolution:=mandatory [caused by: Unable to resolve com.nemesis.osgi-spring-boot-demo-bundle/0.0.1.SNAPSHOT: missing requirement [com.nemesis.osgi-spring-boot-demo-bundle/0.0.1.SNAPSHOT] osgi.extender; filter: = "(&(osgi.extender=osgi.component)(version>=1.3.0)(!(version>=2.0.0)))"]]
    at org.apache.felix.resolver.ResolutionError.toException(ResolutionError.java:42) ~[?:?]
    at org.apache.felix.resolver.ResolverImpl.doResolve(ResolverImpl.java:391) ~[?:?]
    at org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:377) ~[?:?]
    at org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:349) ~[?:?]
    at org.apache.karaf.features.internal.region.SubsystemResolver.resolve(SubsystemResolver.java:218) ~[?:?]
    at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:291) ~[?:?]
    at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1248) ~[?:?]
    at org.apache.karaf.features.internal.service.FeaturesServiceImpl.lambda$doProvisionInThread$1(FeaturesServiceImpl.java:1147) ~[?:?]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:?]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:?]
    at java.lang.Thread.run(Thread.java:748) [?:?]

Вот мой гитхаб репозиторий. Я использую java 8 с maven 3.6, org.osgi.core 5.0.0, Karaf 4.1.3.

Любые идеи, как я могу решить проблему? Является ли правильным способом получения обновлений модификации свойств от Karaf с помощью @Component и @Modified?

Заранее спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
4 618
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сообщение об ошибке означает, что вам не хватает пакета, который соответствует одному из требований вашего пакета.

Вы найдете отсутствующее требование в конце этого длинного сообщения об ошибке:

(&(osgi.extender=osgi.component)(version>=1.3.0)(!(version>=2.0.0)))

Это означает, что вам не хватает расширителя для модели osgi.component.

Так что же там происходит? Вы используете аннотации декларативных служб в своих классах. Плагин пакета maven читает их и создает XML для декларативных служб, а также требование для расширителя выше.

Таким образом, это требование поможет вам не пропустить среду выполнения декларативных служб при установке пакета.

В случае karaf решение состоит в том, чтобы установить функцию, обеспечивающую среду выполнения:

feature:install scr

Спасибо Кристиан за ответ. Я протестирую это сегодня вечером. Можно ли установить функцию scr в контейнере Karaf из моего файла feature.xml вместо того, чтобы делать это вручную в контейнерном терминале Karaf?

NikosDim 20.05.2019 16:25

да. Вы можете добавить его как зависимость функции в файл функции.

Christian Schneider 21.05.2019 08:14

Это отлично сработало. Я изменил свое репо, и ошибка исчезла, и мое приложение успешно запускается, но кажется, что служба (@Component) не работает. Я отредактировал свойства с помощью команды config:property-set, затем я сделал config:update, чтобы сохранить его, но метод с аннотацией Modified никогда не вызывался (у меня есть несколько операторов печати в моем аннотированном методе Modified, но я никогда его не вижу). Что-то не так с моей конфигурацией?

NikosDim 21.05.2019 20:16

Отвечая на мой предыдущий комментарий. Мне не хватало немедленного = true в аннотации компонента

NikosDim 21.05.2019 20:17

Вы получаете указанную ошибку из-за того, что зависимый пакет не установлен или версия установленного пакета не находится в диапазоне,

Вы можете проверить, установлен ли пакет или нет, и какая версия установлена ​​с помощью следующей команды в терминале karaf:

  la -l|grep "#bundle name"

где имя пакета — это пакет, для которого вы получаете сообщение об ошибке,

Иногда может быть так, что отсутствует только один пакет, но есть вероятность, что функция не установлена, функция представляет собой не что иное, как группу пакетов,

Чтобы проверить, установлена ​​ли эта функция или нет, используйте следующую команду:

feature:list|grep "#feature name" 

Здесь вы можете установить эту функцию, и она должна решить проблему.

feature:install scr

Другие вопросы по теме