无法将 bndtools 插件用于 运行 一个简单的 osgi 应用程序

can't use bndtools plugin to run a simple osgi application

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

这是我正在尝试加载的 osgi project/module。

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 class.

包的 bnd.bnd 文件
Bundle-Version: 0.0.0.${tstamp}
Private-Package:  \
    com.counter
Bundle-Activator: com.counter.BundleCounterActivator

我正在尝试将此包上传到教程中定义的 'run bundle' 配置。但是,我收到以下错误:

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'(或者更确切地说,给定 [=43= 中教程项目的 felix osgi 运行time 环境设置])?感谢任何帮助。

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

1) 给定 'run.bndrun' 文件

2) 添加捆绑要求

3) 我在尝试添加时遇到错误 'BundleCounter'

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

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

现在org.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,我建议您使用 here 的最新版本 5.0.1。您需要将它添加到您的本地存储库,以便解析器获取它。

降低 API 依赖项的版本也很容易。您只需要将 osgi.core 上的构建依赖项的版本降低到低于 6 的版本。我不会低于 4.3.1,因为那是在 API 中引入泛型的时候, 5 是我的首选。

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