尝试启动osgi包时出现BundleException

时间:2017-06-19 12:40:24

标签: java jar osgi osgi-bundle

我试图安装&从文件系统中的osgi jar开始一个包

Bundle bundle = context.installBundle("reference:file:" + fullPath);
bundle.start();

它适用于另一个简单的捆绑包,但另一个更复杂的捆绑包

Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"

在其清单

这会导致以下异常

(org.osgi.framework.BundleException) org.osgi.framework.BundleException: Unresolved constraint in bundle
Unable to resolve 42.0: missing requirement [42.0] osgi.ee; (&(osgi.ee=JavaSE)(version=1.8))

如何将此功能添加到我的项目中? 我如何从其他项目中删除此要求?

我发现的所有类似问题都没有回答我的问题

提前感谢任何答案并帮助我不要拔出头发:)

修改

正如Christian建议我尝试在netbeans中找到felix的配置,因为felix框架是由netbeans加载的。我在maven POM文件中找到了一些配置,但是无法使用" org.osgi.framework.system.capabilities"基督徒提到的框架属性,我在文档中找不到。 我正在给予赏金,因为这对我来说非常重要,并且是我唯一阻止我使用OSGi的东西

3 个答案:

答案 0 :(得分:3)

您确定的能力:

Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"

osgi.ee命名空间的要求。这是定义框架执行环境的命名空间。然后,过滤器表示您需要执行环境为JavaSE,并且您需要将版本属性设置为1.8。这(不出所料)对应于Java SE 8.

正如其他人所指出的,这种能力应该由OSGi框架提供。您需要做任何事情来实现这一目标。这种能力不存在有两个主要原因。

  1. 您使用的是较旧版本或非SE版本的Java。如果NetBeans启动配置未使用Java 8安装,则很容易发生这种情况。

  2. 您正在使用不了解Java的“新”版本的Felix框架。这可能是因为您的Felix框架已经过时(最新版本为5.6.4)或者因为您的Java版本非常新(您使用的是预发布的Java 9版本吗?)。

  3. 如果你可以在Java 8之上运行一个新的Felix框架,这真的应该正常工作。你有关于你的环境的更多细节吗?

    编辑:

    您可以看到系统包提供的osgi.ee功能,如下所示:

    // Get the wiring for the system bundle
    BundleWiring wiring = context.getBundle(0).adapt(BundleWiring.class);
    
    // Get the osgi.ee capability for the system bundle
    List<Capability> eecaps = wiring.getCapabilities("osgi.ee");
    
    // There must be exactly one capability to show
    System.out.println(eecaps.get(0).getAttributes());
    

答案 1 :(得分:2)

这是一个需要由框架提供的功能。这意味着您的项目需要在Java 8上运行。

它在framework属性中配置:

org.osgi.framework.system.capabilities=osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8"

这就是说,例如,当您启动felix发行版时,已经配置了这个。

答案 2 :(得分:2)

这是已知的felix错误,已在2.0.4中修复。来自http://svn.apache.org/repos/asf/felix/releases/org.apache.felix.bundlerepository-2.0.10/doc/changelog.txt

Changes from 2.0.2 to 2.0.4
---------------------------
** Bug
* [FELIX-3097] - LocalRepository is not updated when bundles are
* [FELIX-4571] - NullPointerException when using Repository impl with Aries subsystem impl
* [FELIX-4616] - BundleRepository ResourceComparator violates comparison contract
* [FELIX-4640] - missing (&(osgi.ee=JavaSE)(version=1.8)) when embedding in org.apache.felix.framework

** Improvement
* [FELIX-4812] - BundleRepository can be quite CPU intensive when starting a lot of bundles