3

作为一个 OSGi 新手,我正试图绕开 OSGi 运行时的边界。我的应用程序不是基于 OSGi 构建的,即它没有在 OSGi 容器中运行,它启动了一个 OSGi 容器,我们在运行时将 OSGi 包部署到该容器中。其中一些捆绑包注册服务。稍后,在我们的非 OSGi 代码中,我们获取这些服务并使用它们。

我无法在这里围绕 OSGi 边界缠绕我虚弱的思想。具体来说,当我获得一项服务并调用其方法之一时,我是否可以假设所有后续执行都在 OSGi 容器(Felix)中执行?换句话说,该代码中的依赖关系是否通过 OSGi 模块化机制解决?或者我是否因为使用非 OSGi 代码中的服务而失去了 OSGi 管理?

如果我的问题似乎是基于对 OSGi 的明显错误假设,请随时指出。

4

2 回答 2

1

乍得,为了更有效地回答您的问题,我想知道一些事情:1)您究竟是如何从外部应用程序获取服务参考的?2) 外部应用程序是独立的应用程序,还是在不同的容器内?如果是这样,有办法做到这一点。

你提出的问题很有趣。让我们把它放到一个上下文中。假设您能够通过外部应用程序从 Felix 获取对 OSGi 服务的引用。当您使用此服务时,您将通过一个界面与它进行交互。在 OSGi 的该接口中,您将引用导入语句,这些语句将用于接口的方法签名以及任何最终属性。这些导入语句将在您的 pom.xml 文件中定义其匹配的依赖库。

为了让外部应用程序使用该服务,您需要发布一个包含接口的 API“.jar”文件,并引用接口的依赖项。您的外部应用程序将需要使用该 API,并且可能会将其组装到您的 .war、.jar 或 .ear 文件的 lib 目录中。因此,您的外部应用程序的任何依赖项都不会与您的 API 依赖项发生冲突。

只要您可以使用 API,那么您是对的,SPI 的依赖关系都无关紧要。您可以在您的外部应用程序中使用 Spring 3.0.4.RELEASE,并且仍然在您的 OSGi 应用程序中使用 Spring 2.5.6.SNAPSHOT。只要 API 没有任何与外部应用程序冲突的依赖项,就可以了。这里的诀窍是您需要将接口放入一个最小的 .jar 文件作为 API,然后将实现细节放入 SPI。您的外部应用程序将使用 API,而在 OSGI 内部,您将同时使用 API 和 SPI。

请让我知道这可不可以帮你。

于 2012-02-03T04:30:24.667 回答
0

如果你能得到服务,那么依赖关系就满足了,因为除非它们的依赖关系得到满足,否则捆绑包不能提供服务。在外部执行服务并没有真正改变任何东西。

于 2012-02-01T16:59:30.017 回答