Java 如何从Pax Web部署的Web捆绑包访问(Blueprint)OSGi服务?

Java 如何从Pax Web部署的Web捆绑包访问(Blueprint)OSGi服务?,java,osgi,blueprint-osgi,pax-web,eclipse-gemini,Java,Osgi,Blueprint Osgi,Pax Web,Eclipse Gemini,我目前正在使用PaxWeb部署OSGiWeb应用程序包。从这个web包中,我需要访问一组OSGi服务。在系统的其余部分,我使用Blueprint创建和使用服务。这是伟大的,因为它提供代理,阻尼等 从Pax Web部署的Web应用程序包中,访问这些OSGi服务的最佳方式是什么 我的想法是 1) 通过osgi BundleContext属性从ServletContext获取BundleContext,然后使用osgi ServiceTracker类 2) 在web捆绑包中创建一个Blueprint上

我目前正在使用PaxWeb部署OSGiWeb应用程序包。从这个web包中,我需要访问一组OSGi服务。在系统的其余部分,我使用Blueprint创建和使用服务。这是伟大的,因为它提供代理,阻尼等

从Pax Web部署的Web应用程序包中,访问这些OSGi服务的最佳方式是什么

我的想法是

1) 通过osgi BundleContext属性从ServletContext获取BundleContext,然后使用osgi ServiceTracker类

2) 在web捆绑包中创建一个Blueprint上下文文件,其中包含对我需要的服务的引用。Blueprint上下文由Blueprint extender在OSGi服务注册表中注册,我可以从中检索它,然后按id查找bean

3) 使用Springs ContextLoaderListener之类的工具在web.xml文件中创建蓝图上下文

选项1很好,但这意味着我必须跟踪服务,而不能获得Blueprint的任何好处

选项2也很好,只是它遇到了时间问题。实际上,现在有两个服务正在部署应用程序——使用Web.xml文件部署的Pax Web extender和部署Blueprint上下文文件的Blueprint extender(在我的例子中是Gemini)。启动时,这些扩展器同时部署,当Pax web extender实例化任何servlet上下文侦听器时,无法保证OSGi服务注册表中的应用程序上下文可用。这意味着无法从上下文侦听器代码调用OSGi服务

选项3-不太确定是否可以这样做。看起来Spring DM使用了这种方法

我觉得我一定错过了什么——有没有一种简单的方法可以从一个团队内部使用蓝图
Pax Web部署的Web捆绑包?

是的,您缺少另一个可用的捆绑包 使用jndi作为桥接器。 如果使用aries(我不知道gemini),您可以检索任何OSGi服务,也可以作为jndi查找。现在通过web.xml检索这个,您就会没事了

例如使用

osgi:service/<interface>[/<filter>]
osgi:service/[/]
作为web.xml中的jndi源 这样做的好处是,您不会遇到#2的问题 关于#3,这是目前无法做到的。
所以基本上你仍然可以选择3,但我建议使用#4

我忘记了JNDI!我要试一试。刚刚发现你说的有点夸张。希望它能在Gemini/JBoss7中得到支持。我成功地使用了ApacheKaraf和ApacheAries,祝我好运,它也适用于Gemini:)