【问题标题】:Is an OSGi service still "OSGi managed" when it's obtained by non-OSGi code?当通过非 OSGi 代码获得 OSGi 服务时,它是否仍然是“OSGi 托管的”?
【发布时间】:2012-02-24 08:02:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: osgi apache-felix


    【解决方案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。

    如果这有帮助,请告诉我。

    【讨论】:

    • 我认为这可能会有很大帮助。 . .但是,坦率地说,这有点复杂,所以我需要检查一下并做一些测试。但是感谢您的指导。
    【解决方案2】:

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

    【讨论】:

    • 但这是否意味着服务内部的所有代码仍然受限于 osgi 类加载机制来解决任何可能需要解决的问题?或者是否有可能使用对使用该服务的非 osgi 代码有效的类加载器层次结构?这是我的困惑。例如,如果服务使用的某些类位于非 osgi 应用程序的类路径上,我是否承诺服务代码将仅针对通过 osgi 模块化可以看到的内容执行?
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 2013-09-20
    • 2016-09-12
    • 2016-11-27
    • 2014-09-09
    • 2015-07-20
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多