0

我正在尝试使用本教程中概述的过程运行一个简单的应用程序:BndTools 教程项目

这是我要加载的 osgi 项目/模块。

package com.counter;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleListener;

public class BundleCounterActivator implements BundleActivator,
    BundleListener{

    private BundleContext context;

    public void start(BundleContext context) throws Exception{
        this.context=context;

        context.addBundleListener(this);
        printBundleCount();
    }

    public void stop(BundleContext context)throws Exception{
        context.removeBundleListener(this);
    }

    public void bundleChanged(BundleEvent event){

        switch(event.getType()){

        case BundleEvent.INSTALLED:
            System.out.println("Bundle Installed");
            printBundleCount();
            break;

        case BundleEvent.UNINSTALLED:
            System.out.println("Bundle Uninstalled");
            printBundleCount();
            break;
        }
    }

    private void printBundleCount(){
        int count=context.getBundles().length;
        System.out.println("There are currently" +count+ " bundles");
    }
}

这是包含 BundleCounterActivator 类的包的 bnd.bnd 文件。

Bundle-Version: 0.0.0.${tstamp}
Private-Package:  \
    com.counter
Bundle-Activator: com.counter.BundleCounterActivator

我正在尝试将此捆绑包上传到教程中定义的“运行捆绑包”配置。但是,我收到以下错误:

Unable to resolve BundleCounter version=0.0.0.201508121544:
   missing requirement Require[osgi.wiring.package]{}{filter=(&(osgi.wiring.package=org.osgi.framework)

我的问题:如何为这个项目安装缺少的包:'org.osgi.framework'(或者更确切地说,给定链接中教程项目的 felix osgi 运行时环境设置)?任何帮助表示赞赏。

以下是所涉及步骤的屏幕截图:

1)给定'run.bndrun'文件 给定 run.bndrun

2) 添加捆绑需求 在此处输入图像描述

3) 尝试添加“BundleCounter”时出现错误 在此处输入图像描述

4

1 回答 1

1

当 bndtools 尝试解析 bndrun 文件时,它会查询配置的存储库以获取满足您的运行要求所需的功能。它递归地执行此操作,因此在这种情况下会发生以下情况:

  1. 它满足您对 BundleCounter 捆绑包的要求
  2. 它定位 BundleCounter 包,并发现 BundleCounter 需要org.osgi.framework版本[1.8,2)(即至少 1.8 但小于 2.0)的包
  3. 它找不到任何 的提供者org.osgi.framework,并向您报告失败。

Noworg.osgi.framework是 OSGi 核心规范的主要包,始终由 OSGi 框架提供。该包的版本1.8对应于 OSGi Release 6 (JavaDoc here),这是该规范的最新版本。为了满足它,您需要最新版本的 Eclipse Equinox 或 Apache Felix。我可以从第一张图片中看到您使用的是 Apache Felix,但看不到您选择的版本。

要使解析操作起作用,有两种选择。要么您需要一个可以提供 1.8 版 OSGi API 的框架,要么您需要降低您所依赖的 API 的版本。

如果您想获得符合 OSGi Release 6 的 Felix,我建议您使用此处的5.0.1最新版本。您需要将其添加到本地存储库中,以便解析器获取它。

降低 API 依赖的版本也很容易。您只需将构建对 osgi.core 的依赖版本降低到低于 6。我不会比将4.3.1泛型引入 API 时的版本更低,而 5 是我的首选。

一般来说,最好使用您可以使用的任何 API 的最低版本。OSGi 的语义版本控制意味着您知道何时发生重大更改,并且选择可能的最低版本可以为您提供最大的互操作性。

于 2015-08-13T12:41:18.953 回答