Val*_*eme 3 java osgi maven apache-felix
我对 OSGi 和 Apache Felix 非常陌生。目前我正在通过Maven开发一个桌面应用程序,我想通过插件开发一个应用程序。
考虑Intellij Idea IDE,我正在开发这种GUI应用程序。准备好的产品将是裸露的,即它将有菜单栏、工具栏、状态栏。但我想通过 FileChooser 选择 jar 文件来将其他一些组件添加到应用程序中。选择文件后,应用程序将自行安装。例如,我想通过外部 jar 文件添加一些新功能,例如新工具按钮或功能等。
OSGi 似乎非常好且合适的框架来实现此功能。但在几乎所有 OSGi 书籍中,新捆绑包仅通过命令行使用 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.
*/
});
Run Code Online (Sandbox Code Playgroud)
插件(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;
}
}
Run Code Online (Sandbox Code Playgroud)
我已将 Apache Felix 作为依赖项包含在 pom.xml 文件中,现在我想以编程方式安装选定的捆绑包(jar 文件)。我被困在这里了。
这个怎么做?
如果我理解得很好,在你的应用程序中你需要一个菜单项,它打开一个文件对话框,你可以在其中选择一个以编程方式安装的 jar 文件。
您可以使用 BundleContext 以编程方式在 OSGi 中安装任何捆绑包。请参阅以下函数:
上面的函数返回一个Bundle实例。安装捆绑包后,您至少需要激活该捆绑包,以便它可以注册其 OSGi 服务。您可以通过调用bundle.start()函数来完成。
有更复杂的用例,您应该刷新框架的包,但我认为在您的情况(运行时可安装插件)中,您几乎不希望拥有其他插件或应用程序本身想要连接的插件。
您可能希望阻止用户获取任何 JAR 文件。为了进行限制,我将在您的情况下引入自定义 Bundle-Capability。如果想要实现一个插件,他/她必须将一个 Provide-Capability MANIFEST 标头添加到他的包中。例如:
Provide-Capability: myappplugin;myappplugin=zipcompressor
Run Code Online (Sandbox Code Playgroud)
在安装捆绑包之前,您可以使用纯 Java API 读取 JAR 文件的 MANIFEST 文件,并使用bndlib或felix-utils对其进行处理,这样您就可以获得 JAR 捆绑包是否具有必要功能的信息,并通知用户如果它不是。
稍后您将希望在该功能中引入新属性,例如:插件想要使用的必要应用程序版本范围。
如果您熟悉 OSGi,这需要几天的时间。
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |