【问题标题】:BundleException while trying to start an osgi bundle尝试启动 osgi 包时出现 BundleException
【发布时间】:2017-11-21 16:28:37
【问题描述】:

我正在尝试从文件系统中的 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))

如何将此功能添加到我的项目中? 还有我如何从其他项目中删除这个需求?

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

在此先感谢您的任何回答并帮助我不拔头发:)

编辑:

正如克里斯蒂安建议的那样,我尝试在 netbeans 中找到 felix 的配置,因为 felix 框架是由 netbeans 加载的。我在 maven POM 文件中找到了一些配置,但无法使用我在文档中找不到的 christian 提到的“org.osgi.framework.system.capabilities”框架属性。 我正在悬赏,因为这对我来说非常重要,并且是唯一阻止我使用 OSGi 的原因

【问题讨论】:

    标签: java jar osgi osgi-bundle


    【解决方案1】:

    您确定的能力:

    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. 您使用的 Felix 框架不理解 Java 的“新”版本。这可能是因为您的 Felix 框架较旧(最新版本是 5.6.4)或因为您的 Java 版本非常新(您使用的是预发布的 Java 9 版本吗?)。

    如果您可以在 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());
    

    【讨论】:

    • 我对所有东西都使用了新版本——netbeans、java、felix,所以这不可能是版本问题,除非是新版本引起的,但我尝试使用旧版本的 felix还是不行
    • 你能让 gogo shell 在你的框架中运行吗?如果是这样,inspect cap osgi.ee 0 的输出是什么?
    【解决方案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
    

    【讨论】:

    • 我对所有东西都使用了新版本——netbeans、java、felix,所以这不可能是版本问题,除非是新版本引起的,但我尝试使用旧版本的 felix还是不行
    【解决方案3】:

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

    在框架属性中配置:

    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 发行版时已经配置好了。

    【讨论】:

    • 好吧,我在这两个项目上都在 Java 8 上运行。框架属性在哪里配置?这是 maven 中的两个新的 maven osgi 项目
    • 我只有两个 OSGi 捆绑项目。一个在运行时从文件系统动态加载另一个的 jar。
    • 好的 .. 但是你如何启动你的 OSGi 环境 .. 你使用哪个
    • 我目前不知道如何启动它,但我正在使用 apache felix 并且 maven-bundle-plugin 指向 Bundle-Activator。这是由 netbeans 自动创建的。如何开始它可能是另一个问题的帖子。我只是在调试模式下启动项目,这会将我带到 Activator 类的 start 方法来动态加载另一个 jar。
    • 在这种情况下,netbeans 可能正在为您启动 OSGi 框架。因此,您必须检查如何在 netbeans OSGi 支持中设置框架属性。嗯 .. 你检查过 netbeans 确实使用 jdk 8 吗?
    猜你喜欢
    • 2012-08-17
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2011-03-27
    相关资源
    最近更新 更多