我的目标是从捆绑软件中删除对OSGi的依赖。我将felix(v 4.2.1)用作impl并以可嵌入方式运行它。我安装了org.apache.felix.scr(v.6.2.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的第一个块在嵌入侧(即框架之外,而不是已安装的捆绑包中)。

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

您可以仅从框架捆绑包导出SCR捆绑包导出的内容。

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

因此,将SCR运行时捆绑包的Export-Package清单标头复制为框架属性:

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类,对于SCR运行时而言,AFIAK是必需的。
除非您认真地定制实际的框架,否则不应该使用Constants.FRAMEWORK_SYSTEMPACKAGES,相反,您可能想使用Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA扩展框架捆绑软件导出的内容。 (框架实现对于FRAMEWORK_SYSTEMPACKAGES具有非常好的默认值,并且在嵌入时通常无需修改)。

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

10-10 11:43