java - 如何从 java 应用程序使用 OSGi

标签 java osgi equinox

我是 OSGi 的新手,但它很有趣。 osgi 包和 java 应用程序之间可以交互吗?如果可以的话,如何实现? 谢谢!

上下文是我有一个大型 Java SE 应用程序(作者是另一位程序员),具有许多依赖项。首先,我的目标是添加新功能,其次是更改架构。我将尝试使用 OSGi,但我不想编写两次代码,因此我想现在将新代码编写为 bundle 。但请使用旧应用程序中的新功能。

最佳答案

是的!是的!是的!这是开始利用 OSGi 并向基于服务的应用程序发展的完美方式。

使用 4.2 启动器 API 创建框架非常简单,甚至不需要知道您使用哪个框架实现。您将获得一个 Framework 对象,它实际上是一个 OSGi Bundle,并且可以为您提供 BundleContext。您可以使用它来安装 bundle 。这一切都在规范中进行了描述,但您可以在 Felix 中找到很多具体且优秀的示例:http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html 。 Felix 从第一天起就明确提倡嵌入应用程序。

这种方法的困难部分是适应模块化及其限制。为了发挥作用,您必须在 OSGi 包和您的应用程序之间共享类;这需要使用 org.osgi.framework.systempackages.extra 属性从应用程序中显式导出这些共享包。此属性是应用程序的 Export-Package header 。

由于 Java 中的类加载模型,无法从框架中的 bundle 导入包。这意味着您的应用程序代码只能使用框架中的服务,其中这些服务的包位于应用程序类路径上。

这样做的结果是,新功能往往会转向具有完全可见性的 bundle :导出的应用程序包以及任何 bundle 。然而,这可能正是您想要的。

因此请注意这个潜在的陷阱。嵌入,然后随着时间的推移将所有代码迁移到 bundle 中,以便您的应用程序仅成为 OSGi 启动器。但是,请务必注意两个环境之间共享的包。

祝你好运,让我们知道进展如何。

关于java - 如何从 java 应用程序使用 OSGi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2756784/

相关文章:

java - 找不到类 java.io.ByteArrayInputStream 的序列化器

java - 激活文件夹中的所有 bundle

java - Osgi同步服务

Java 与 C++ : Performance in application using web services

java - tomcat不是应用服务器是什么原因

adobe - 在 Adob​​e CQ 中确定运行模式

linux - OSGi headless running on linux - org.eclipse.core.runtime 无法获取应用程序服务

java - OSGI:如何找出哪些 bundle 订阅了我的服务引用字典中定义的特定属性?

java - 如何将Arraylist拆分为更小的列表?

java - OSGI 外部配置器文件夹未加载