gpt4 book ai didi

java - 使用服务组件运行时

转载 作者:行者123 更新时间:2023-11-29 03:34:47 25 4
gpt4 key购买 nike

我的目标是从我的包中删除对 OSGi 的依赖。我使用 felix (v 4.2.1) 作为 impl 并运行它可嵌入。我安装了 org.apache.felix.scr (v. 1.6.2) 包以获得服务组件运行时支持。但是当我跑的时候

 ServiceReference ref = bundleContext().getServiceReference(ScrService.class.getName());
ScrService s = (ScrService) bundleContext().getService(ref);

我得到 ClassCastException: org.apache.felix.scr.impl.ComponentRegistry cannot be cast to org.apache.felix.scr.ScrService

好的。我将修改系统包。

config.put(Constants.FRAMEWORK_SYSTEMPACKAGES, "org.apache.felix.scr");

现在我明白了

Caused by: org.osgi.framework.BundleException: Unresolved constraint in bundle org.apache.felix.scr [1]: Unable to resolve 1.0: missing requirement [1.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.4.0)(!(version>=2.0.0)))
at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
at com.copyright.rup.communications.felix.Felix.addBundle(Felix.java:86)
... 28 more

我该如何解决?

最佳答案

我怀疑您尝试获取 ScrService 的第一个 block 是在嵌入端(即在框架之外,而不是在已安装的包中)。

如果是这种情况,那么您有两个 ScrService 副本 - 一个从您的嵌入代码的 ClassLoader 加载,另一个由 scr 包的 ClassLoader 在框架解析时加载。这就是您看到 ClassCastException 的原因。

您可以只导出 SCR 包从框架包中导出的内容。

第 3.8 节,第 51 页 OSGi Core spec v5声明在捆绑布线的解析中,如果一个模块具有同一包的导入和导出定义,那么框架将首先尝试从外部解析,如果成功则丢弃重叠的导出定义。

因此,将 SCR 运行时包的 Export-Package list header 复制为框架属性:

properties.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, 
"org.ops4j.pax.url.mvn,org.apache.felix.scr;uses:=\"org.osgi.framework," +
"org.osgi.service.component\";version=\"1.7\"," +
"org.apache.felix.scr.component;status=provisional;mandatory:=status;" +
"uses:=\"org.osgi.service.component\";version=\"1.0\"," +
"org.osgi.service.component;uses:=\"org.osgi.framework\";version=\"1.2\"");

//Which you pass to the FrameworkFactory ...

ServiceLoader<FrameworkFactory> loader = ServiceLoader.load(FrameworkFactory.class);
Iterator<FrameworkFactory> iterator = loader.iterator();
Framework framework = iterator.next().newFramework(properties);
framework.start();

有几点需要注意:

  • 如果您还没有使用 ConfigurationAdmin,那么还要安装 org.osgi.compendium确保您至少拥有 org.osgi.service.cm.*org.osgi.service.metatype* 的 API 类,AFAIK 这些对于SCR 运行时。

  • 你不应该使用 Constants.FRAMEWORK_SYSTEMPACKAGES 除非你认真地定制实际的框架,相反你可能想要使用 Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA扩展 框架包导出的内容。 (框架实现对 FRAMEWORK_SYSTEMPACKAGES 有很好的默认值,嵌入时通常不需要修改它)。

关于java - 使用服务组件运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16150855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com