作为一名OSGi新手,我试图围绕OSGi运行时的界限。我的应用程序不是在OSGi上构建的,即它不在OSGi容器中运行,它启动了一个OSGi容器,我们在运行时将OSGi包部署到该容器中。其中一些捆绑包注册服务。稍后,在我们的非OSGi代码中,我们获取这些服务并使用它们。
我在这里围绕OSGi边界缠绕我的虚弱心灵时遇到了麻烦。具体来说,当我获得服务并调用其中一个方法时,我可以假设所有后续执行都在OSGi容器(Felix)中执行吗?换句话说,该代码中的依赖关系是通过OSGi模块化机制解决的吗?或者我失去了OSGi管理,因为我使用的是非OSGi代码的服务?
如果我的问题似乎建立在关于OSGi的明显错误假设的基础上,请随时指出它们。
答案 0 :(得分:1)
乍得,为了更有效地回答你的问题,我想知道一些事情: 1)您是如何从外部应用程序获取服务引用的? 2)外部应用程序是独立应用程序,还是在不同容器内?如果是这样,有办法实现这一目标。
你提出的问题很有意思。让我们把它放到一个上下文中。让我们假设您可以通过外部应用程序从Felix获取对OSGi服务的引用。使用此服务时,您将通过界面与其进行交互。在OSGi的该接口中,您将引用引用语句,这些语句将用于接口的方法签名以及任何最终属性中。这些import语句将在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。您的外部ap将使用API,而在OSGI中,您将使用API和SPI。
如果有帮助,请告诉我。
答案 1 :(得分:0)
如果您可以获得服务,那么依赖关系将通过定义得到满足,因为除非满足依赖关系,否则bundle不能提供服务。在外面执行服务并没有真正改变任何事情。