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

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

而且OSGi似乎是实现此功能的非常好的适当框架。
但是在几乎所有的OSGi书籍中,仅通过命令行使用Apache Felix,Equinox等工具(框架)安装的新软件包。

我已经创建了Github存储库https://github.com/Valeme/osgi-shape-app
这是Maven项目,它有两个模块。第一个是用JavaFX编写的GUI应用程序(osgi-shape模块),第二个是插件,安装后,应在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.
     */
});


插件(捆绑罐)将实现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文件中,现在我想以编程方式安装选定的捆绑软件(jar文件)。我被困在这里。

这该怎么做?

最佳答案

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

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


bundleContext.installBundle(location);
bundleContext.installBundle(location, inputstream);


上面的函数返回Bundle实例。安装捆绑软件后,您至少要激活捆绑软件,以便它可以注册其OSGi服务。您可以通过调用bundle.start()函数来实现。

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

您可能要阻止用户拾取任何JAR文件。为了限制,我将在您的情况下引入自定义的捆绑功能。如果要实现插件,则他/她必须在其包中添加Provide-Capability MANIFEST标头。例如:

Provide-Capability: myappplugin;myappplugin=zipcompressor


在安装捆绑软件之前,您可以使用简单的Java API读取JAR文件的MANIFEST文件,并使用bndlibfelix-utils对其进行处理,以便在JAR-Bundle具有必要的功能并通知该工具时获取信息。用户,如果没有。

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

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

09-16 06:43