如何将Apache Felix包含到Maven项目中以便以编程方式安装bundle?

时间:2018-04-04 06:54:30

标签: java maven osgi apache-felix

我是OSGi和Apache Felix的新手。目前我正在开发Maven的桌面应用程序,我想通过插件开发应用程序。

考虑Intellij Idea IDE,我正在开发这种GUI应用程序。现成的产品将是裸产品,即它将具有MenuBar,ToolBar,StatusBar。但是我想通过FileChooser选择jar文件来添加一些其他组件。选择文件后,应用程序将自行安装。例如我想通过外部jar文件添加一些新功能,如新工具按钮或功能等。

OSGi似乎是非常好的和适当的框架来实现这个功能。 但是在几乎所有的OSGi书籍中,新的bundle只能通过命令行安装,如Apache Felix,Equinox等工具(框架)。

我创建了Github存储库https://github.com/Valeme/osgi-shape-app。 这是Maven项目,它有两个模块。第一个GUI应用程序(osgi-shape模块)是用JavaFX编写的,第二个是插件,安装完成后应该在osgi-shape-app的内容中绘制一些形状。

这是菜单项示例。

MenuItem loadExt = new MenuItem("Load extension");
loadExt.setOnAction(event -> {
    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Open Bundle ");
    fileChooser.getExtensionFilters().addAll(
            new FileChooser.ExtensionFilter("jar", "*.jar"));
    File selectedFile = fileChooser.showOpenDialog(stage);

    System.out.println("selectedFile = " + selectedFile);

    /*
    Here I want to install jar file.
     */
});

插件(bundle jar)将实现Component接口。这是一个椭圆的例子。

public class MyEllipse extends Ellipse implements Component {

    public MyEllipse() {
        super(300, 300, 60, 80);
        setFill(Color.RED);
    }

    @Override
    public Shape getComponent() {

        return this;
    }
}

我已将Apache Felix作为pom.xml文件中的依赖项包含在内,现在我想以编程方式安装选定的bundle(jar文件)。我被困在这里。

怎么做?

1 个答案:

答案 0 :(得分:4)

如果我理解的话,在您的应用中,您需要一个菜单​​项,它会打开一个文件对话框,您可以在其中选择以编程方式安装的jar文件。

您可以使用BundleContext以编程方式在OSGi中安装任何捆绑包。请参阅以下功能:

上述函数返回 Bundle 实例。安装捆绑包后,您希望至少激活捆绑包,以便它可以注册其OSGi服务。您可以通过调用bundle.start()函数来执行此操作。

有更复杂的用例,您应该刷新框架的包,但我认为在您的情况下(运行时可安装的插件)您几乎不想拥有其他插件或应用程序本身想要连接到的插件

您可能希望阻止用户选择任何JAR文件。要有限制,我会在您的情况下引入自定义Bundle-Capability。如果想要实现插件,他/她必须在他的包中添加Provide-Capability MANIFEST标头。 E.g:

Provide-Capability: myappplugin;myappplugin=zipcompressor

在安装捆绑包之前,您可以使用普通Java API读取JAR文件的MANIFEST文件,并使用bndlibfelix-utils处理它,以便您可以获取有关JAR-Bundle的信息具有必要的能力,如果没有,则通知用户。

稍后您将要在该功能中引入新属性,例如:插件想要使用的必要应用程序版本范围。

如果您熟悉OSGi,这需要几天时间。