Java 使用嵌入式OSGi定义和公开主机API

Java 使用嵌入式OSGi定义和公开主机API,java,maven,osgi,apache-felix,osgi-bundle,Java,Maven,Osgi,Apache Felix,Osgi Bundle,我目前正在为插件的目的将OSGi模块化添加到一个项目中。其基本思想是用户可以开发自己的插件,这些插件可以在运行时添加到主应用程序中,以扩展或修改其功能和/或功能 例如,主应用程序使用RESTlet为应用程序定义HTTP API。用户可能希望创建一个插件来添加具有特定功能的端点。或者,他们可能希望创建一个新实体,该实体存储在数据库中,具有特定的用途 我知道这不是一个“真正的”OSGi模块化应用程序实现,经过一些研究,我成功地通过嵌入式Felix将OSGi功能添加到现有项目中。与felix.file

我目前正在为插件的目的将OSGi模块化添加到一个项目中。其基本思想是用户可以开发自己的插件,这些插件可以在运行时添加到主应用程序中,以扩展或修改其功能和/或功能

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

我知道这不是一个“真正的”OSGi模块化应用程序实现,经过一些研究,我成功地通过嵌入式Felix将OSGi功能添加到现有项目中。与felix.fileinstall一起,应用程序监视部署文件夹,并自动安装和启动放入部署文件夹中的jar包,删除后停止并卸载

因此,基本思想得到了实施,效果良好。我很难理解的是如何定义和发布可以由任何插件包实现的主要应用程序API。另一方面,我不明白捆绑包开发人员如何能够访问这些API信息


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

一种方法是将framework launch属性设置为应用程序类加载器,将framework launch属性设置为要向插件公开的包列表。然后,插件将以与任何其他包相同的方式在其包清单中为您的应用程序包使用导入包。

这会在运行时将两个应用程序“绑定”在一起,以便插件可以访问我要公开的核心应用程序API。然而,我仍然不明白这在开发过程中有什么帮助?不能写入import com.parent.some.package.Class;如果不是依赖项,则希望IDE导入该类。您既不能使核心应用程序成为插件的依赖项,因为它将公开比所需API更多的内容。我觉得我应该提供一个插件开发人员用作依赖项的SDK?@tarka我不知道您在IDE中试图解决什么问题。您是否试图防止人们意外地依赖应用程序JAR中的非API类?当然,插件编译所依据的API专用JAR就是您所说的SDK?可以工作,或者只是记录插件作者应该使用什么。他们要么遵循文档,他们的插件会工作,要么使用不应该使用的东西,OSGi会在运行时阻止它们;核心主机应用程序和完全独立的OSGi捆绑包。在运行时,OSGi捆绑包向主机应用程序注册,主机向捆绑包公开API方法。但是,当我开发包时,它没有向主机注册。它是一组独立的类。那么,如何让捆绑包知道IDE中的主机API,以便我可以将主机API类导入捆绑包类呢?我不理解IDE问题与OSGi问题之间的关系,因此我建议打开一个单独的问题。我猜答案将取决于您使用的IDE?对不起,我没有很好地解释我自己!脚本主机应用程序是专有的,因此您无法访问它。但是,我在文档中定义主机将公开API com.example.host.API.SayHello。当您除了在运行时之外没有访问主机应用程序的权限时,如何开发一个可以导入com.example.host.api.SayHello的捆绑包?