我是OSGi的新人,但很有意思.是否可以在osgi bundle和java应用程序之间进行交互?如果有可能,怎么样?谢谢!
上下文是我有一个很大的Java SE应用程序(作者是另一个程序员),有许多依赖项.首先,我的目标是添加新功能和第二次更改架构.我将尝试使用OSGi,但我不想两次编写代码,因此我想编写新代码作为bundle.但是使用旧应用程序中的这个新功能.
Pet*_*ens 10
是! 是! 是的!这是开始利用OSGi并向基于服务的应用程序发展的完美方式.
使用4.2启动程序API创建一个框架,甚至不知道您使用哪个框架实现,这是微不足道的.你得到一个Framework对象,那么它实际上是一个OSGi Bundle,可以为你提供一个BundleContext.您可以使用它来安装捆绑包.这一切都在规范中描述,但你可以在Felix中找到很多具体和优秀的例子:http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html.从第一天开始,Felix就已明确推广嵌入应用程序.
这种方法的难点在于习惯模块化及其限制.为了有用,您必须在OSGi包和您的应用程序之间共享类; 这需要使用org.osgi.framework.systempackages.extra属性从应用程序中显式导出这些共享包.此属性是应用程序的Export-Package标头.
由于Java中的类加载模型,无法从框架中的bundle导入包.这意味着您的应用程序代码只能使用来自框架的服务,其中这些服务的包位于apps类路径中.
这样做的结果是新功能倾向于转向具有完全可见性的捆绑包:导出的应用程序包以及任何捆绑包.但是,这可能正是您想要的.
所以要注意这个潜在的陷阱.嵌入,然后随着时间的推移将所有代码迁移到bundle,以便您的应用程序成为OSGi启动器.但是,要非常了解您在两个环境之间共享的包.
祝你好运,让我们知道这是怎么回事.