如何从java应用程序使用OSGi

如何从java应用程序使用OSGi,java,osgi,equinox,Java,Osgi,Equinox,我是新来的,但这很有趣。 osgi捆绑包和java应用程序之间可以交互吗?如果可能,怎么做? 谢谢 上下文是我有一个很大的JavaSE应用程序(作者是另一个程序员),它有很多依赖项。首先,我的目标是添加新功能,其次是更改体系结构。我将尝试使用OSGi,但我不想编写两次代码,因为这个原因,我现在想以捆绑包的形式编写新代码。但是使用旧应用程序的新功能。我认为OSGi是一种结构化技术。您可以使用它来定义应用程序的组件结构。因此,您的所有应用程序实际上都是OSGi捆绑包的集合。因此,交互不是问题,只是应

我是新来的,但这很有趣。 osgi捆绑包和java应用程序之间可以交互吗?如果可能,怎么做? 谢谢


上下文是我有一个很大的JavaSE应用程序(作者是另一个程序员),它有很多依赖项。首先,我的目标是添加新功能,其次是更改体系结构。我将尝试使用OSGi,但我不想编写两次代码,因为这个原因,我现在想以捆绑包的形式编写新代码。但是使用旧应用程序的新功能。

我认为OSGi是一种结构化技术。您可以使用它来定义应用程序的组件结构。因此,您的所有应用程序实际上都是OSGi捆绑包的集合。因此,交互不是问题,只是应用程序的不同部分以正常方式交互

[在评论澄清后编辑。]

您有一个基本的决定:您的OSGi代码将在与原始代码相同的进程中执行,还是在单独的进程中执行

分离意味着可以自由地按照您的意愿构造新代码,利用OSGi,但代价是进程间通信的复杂性和性能开销。很有可能,为了支持某种形式的远程处理,您最终会对现有应用程序进行重大更改。我不认为这是一个很好的方法,除非您的OSGi代码恰好是其他远程客户端可能会使用的某种可重用服务

如果在同一个过程中,那么我会说,你需要咬紧牙关,说这将是一个OSGi应用程序。获取现有应用程序并使其在OSGi中运行所需的工作量不必过大


假设您将现有应用程序视为一个庞大的OSGi包?在初始化方面会有一些工作,但其余的工作会“起作用”吗?如果您将此作为第一步,那么现有应用程序的真正重新架构和模块化就会推迟。然后,只需公开新模块所需的接口,并在必要时使用新模块提供的服务。通过构建依赖关系,您马上就能获得OSGi的好处。

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

在不知道使用哪种框架实现的情况下,使用4.2启动器API创建框架是很简单的。您得到了一个框架对象,它实际上是一个OSGi包,可以为您提供一个BundleContext。您可以使用它来安装捆绑包。这一切在规范中都有描述,但您可以在Felix中找到许多具体而优秀的示例:。Felix从第一天起就一直在推广嵌入式应用

这种方法的难点在于适应模块化及其限制。为了有用,您必须在OSGi捆绑包和应用程序之间共享类;这需要使用org.osgi.framework.systempackages.extra属性从应用程序显式导出这些共享包。此属性是应用程序的导出包标头

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

这样做的结果是,新功能倾向于漂移到具有完全可见性的捆绑包:导出的应用程序包以及任何捆绑包。然而,这可能正是你想要的

所以要注意这个潜在的陷阱。嵌入,然后随着时间的推移将所有代码迁移到bundle中,这样应用程序就变成了一个OSGi启动器。但是,要非常清楚这两个环境之间共享的软件包


祝你好运,让我们知道这是怎么回事。

使用OSGi构建的应用程序可以与两个普通(Java)应用程序以相同的方式进行交互。因此,通过加载/保存文件。或者,当其中一个被创建为OSGiHTTP服务器时,只需通过http与该(OSGi)服务器通信即可。想想你以前的做法,不包括OSGi。

你所说的“OSGi捆绑包和java应用程序之间的交互”是什么意思?但是如何进行这种交互?请进一步解释这个问题。如果您在一个Jar中定义了一个类的Java对象,而该对象想要使用在另一个Jar中定义的类的功能,您会怎么做?OSGi除了加载东西的一些小细节之外没有太大的变化——这些都在OSGi教程中有记录。实际的方法调用只是方法调用。请解释您认为有问题的交互。我将尝试使用一个大型JavaSE应用程序(作者是另一位程序员),它具有许多依赖项。首先,我的目标是添加新功能,其次是更改体系结构。我将尝试使用OSGi,但我不想编写两次代码,因为这个原因,我现在想以捆绑包的形式编写新代码。但是,请使用旧应用程序中的新功能。刚才:)是的,将现有的应用程序作为一个巨大的OSGi包进行开发也是非常有趣的。有可能是这样的一段代码吗?谢谢