OSGi服务仍然是一种“服务吗?”;“OSGi管理”;当它';通过非OSGi代码获取的?

OSGi服务仍然是一种“服务吗?”;“OSGi管理”;当它';通过非OSGi代码获取的?,osgi,apache-felix,Osgi,Apache Felix,作为一名OSGi新手,我正试图了解OSGi运行时的边界。我的应用程序不是基于OSGi构建的,也就是说,它不是在OSGi容器中运行的,它启动一个OSGi容器,我们在运行时将OSGi捆绑包部署到其中。其中一些包注册服务。稍后,在我们的非OSGi代码中,我们获得并使用这些服务 在OSGi的边界上,我很难把我脆弱的思想包装起来。具体来说,当我获取一个服务并调用它的一个方法时,我是否可以假设所有后续执行都在OSGi容器(Felix)中执行?换句话说,代码中的依赖关系是否通过OSGi模块化机制解决?还是因为

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

在OSGi的边界上,我很难把我脆弱的思想包装起来。具体来说,当我获取一个服务并调用它的一个方法时,我是否可以假设所有后续执行都在OSGi容器(Felix)中执行?换句话说,代码中的依赖关系是否通过OSGi模块化机制解决?还是因为我使用非OSGi代码的服务而失去了OSGi管理


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

如果您可以获得服务,那么依赖关系就可以根据定义得到满足,因为捆绑包不能提供服务,除非它们的依赖关系得到满足。在外部执行服务并不会真正改变任何事情。

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

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

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

只要您可以使用API,那么您是对的,SPI的依赖关系都不重要。您可以在外部应用程序中使用Spring3.0.4.RELEASE,但在OSGi应用程序中仍然使用Spring2.5.6.SNAPSHOT。只要API没有任何与外部应用程序冲突的依赖项,您就可以了。这里的技巧是,您需要将接口作为API放入一个最小的.jar文件中,然后将实现细节放入SPI中。您的外部ap将使用API,而在OSGI内部,您将同时使用API和SPI


请让我知道这是否有帮助。

但这是否意味着服务中的所有代码仍然限于osgi类加载机制,以解决可能需要解决的任何问题?或者是否可能使用对使用该服务的非osgi代码有效的类加载器层次结构?这是我的困惑。例如,如果服务使用的某些类位于非osgi应用程序的类路径上,我是否承诺服务代码将仅针对通过osgi模块化可以看到的内容执行?我认为这可能会有很大帮助。但是,坦率地说,它有点复杂,所以我需要检查它并做一些测试。但是谢谢你的指导。