2015-09-06 50 views
0

我目前正在对OSGi的模块化添加到项目的插件目的。基本思想是用户可以开发自己的插件,它们可以在运行时添加到主应用程序以扩展或修改其功能和/或功能。定义和暴露主机API嵌入OSGi的

例如,主应用程序使用Restlets为应用程序定义HTTP API。用户可能希望创建一个插件来添加具有特定功能的端点。或者他们可能希望创建一个存储在数据库中的具有特定用途的新实体。

我知道这不是'真正的'OSGi模块化应用程序实现,经过一番研究后,我很容易地将OSGi功能添加到嵌入Felix的现有项目中。与felix.fileinstall一起,应用程序监视一个deploy文件夹,并自动安装并启动放入deploy文件夹的jar包(停止和卸载时除外)。

所以基本思想得到实施并且工作得很好。我很难理解的是我如何定义和发布主应用程序API(可以通过任何插件包实现)。另一方面,我不明白软件包开发人员如何获得该API信息?

为了使包开发人员能够使用API​​,他们需要某种SDK?

回答

0

一种方法是将Constants.FRAMEWORK_BUNDLE_PARENT框架启动属性设置为您的应用程序类加载器,并将Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA框架启动属性设置为您要公开给插件的软件包列表。然后,插件将使用Import-Package作为您的应用程序包的捆绑软件清单,其方式与其他任何软件包相同。

+0

这会在运行时将两个应用程序“绑定”在一起,以便插件可以访问我想公开的核心应用程序API。但是,我仍然不明白这是如何在开发过程中起作用的?你不能在插件中写入'import com.parent.some.package.Class;',并期望IDE导入那个类,如果它不是依赖项的话。你不能让核心应用程序成为插件的依赖关系,因为它会暴露更多只是所需的API。我觉得我应该提供一个插件开发人员用作依赖项的SDK? – tarka

+0

@tarka我不知道你想在IDE中解决什么问题。您是否试图防止人们意外地依赖作为应用程序JAR一部分的非API类?那么可以肯定的是,一个仅供API编译的API(仅限于“SDK”?)可以工作,或者只是记录插件作者应该使用的插件。他们要么遵循文档,他们的插件将工作,否则他们会使用他们不应该的东西,OSGi会在运行时阻止他们。 –

+0

目前情况是有2个独立的JAR;核心主机应用程序和完全独立的OSGi软件包。在运行时,OSGi包向主机应用程序注册,主机将API方法公开给包。但是,当我开发捆绑包时,它并未向主机注册。它是一组独立的类。那么如何让IDE知道IDE中的主机API,以便我可以将主机API类导入到bundle类中? – tarka