【问题标题】:Karaf OSGi config throws ResolutionException: Unable to resolve root: missing requirement [root] osgi.identity;Karaf OSGi 配置抛出 ResolutionException: Unable to resolve root: missing requirements [root] osgi.identity;
【发布时间】:2019-10-06 07:47:36
【问题描述】:

我正在创建一个将在 Karaf 上运行的 Spring Boot 应用程序。我试图在 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) [?:?]

这是我的github repo。我正在使用 java 8 和 maven 3.6、org.osgi.core 5.0.0、Karaf 4.1.3

有什么想法可以解决这个问题吗?使用@Component 和@Modified 从Karaf 获取属性修改更新的正确方法是什么?

提前致谢!

【问题讨论】:

    标签: java osgi apache-karaf osgi-bundle karaf-maven-plugin


    【解决方案1】:

    错误消息意味着您缺少一个提供您的捆绑包要求之一的捆绑包。

    您会在此长错误消息的末尾找到缺少的要求:

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

    这意味着您缺少 osgi.component 模型的扩展器。

    那么那里发生了什么?您在类中使用声明性服务注释。 maven bundle 插件读取它们并为声明性服务创建 xml 以及对上述扩展器的要求。

    因此,此要求可帮助您在安装包时不会错过声明式服务运行时。

    如果是 karaf,解决方案是安装提供运行时的功能:

    feature:install scr
    

    【讨论】:

    • 感谢克里斯蒂安的回答。我今晚会测试一下。是否可以通过我的 feature.xml 文件在 Karaf 容器上安装 scr 功能,而不是在 Karaf 容器终端中手动安装?
    • 是的。您可以将其作为功能依赖项添加到功能文件中。
    • 效果很好。我已经更改了我的存储库,错误消失了,我的应用程序成功启动,但服务(@Component)似乎无法正常工作。我确实使用 config:property-set 命令编辑了属性,然后我执行了 config:update 来保存它,但是从未调用过带有 Modified 注释的方法(我的 Modified 注释方法中有一些打印语句,但我从未看到它)。我的配置有什么问题吗?
    • 回答我之前的评论。我在组件注释中缺少 immediate=true
    【解决方案2】:

    您收到上述错误是因为未安装依赖包或已安装包的版本不在范围内,

    您可以在 karaf 终端中通过以下命令检查捆绑包是否已安装以及安装的版本是什么:

      la -l|grep "#bundle name"
    

    其中包名称是您收到错误的包,

    有时可能只缺少一个捆绑包,但有可能未安装该功能,该功能只是一组捆绑包,

    要检查该功能是否已安装,请使用以下命令:

    feature:list|grep "#feature name" 
    

    在这里,您可以安装该功能,它应该可以解决问题

    feature:install scr
    

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2019-05-30
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多