在OSGI环境中注册Restlet转换器

时间:2012-11-28 19:50:24

标签: osgi restlet restlet-2.0

我们在OSGi环境(Equinox)中运行Restlet 2.1作为bundle(即不作为bundle中的库)。问题是Restlet引擎不会检测Restlet扩展提供的帮助程序(如转换器)。具体来说,EngineClassLoader#getResources()调用不会返回任何结果。这些扩展也在目标平台中作为OSGi包部署。

自动转换器注册是否真的应该在OSGi环境中工作?

3 个答案:

答案 0 :(得分:1)

事实上,Restlet支持这样的功能,这要归功于一个专用的激活器(参见包org.restlet.engine.internal中的Activator类)。

这个激活器会对bundle进行内省,以找出以下内容:

  • 与注册服务器对应的服务器
  • 与注册客户相对应的服务器
  • 与注册客户相对应的验证者
  • 转换器

请注意,要使用此功能,我们必须使用Restlet的OSGi版本,因为它是唯一具有指定激活器类的org.restlet包的MANIFEST文件。否则你不必关心捆绑加载订单......

希望它对你有所帮助。 亨利

答案 1 :(得分:0)

除非Restlet-bundle显式地导入包含扩展名的包(我怀疑它确实存在,并且它不应该),否则它将无法加载它们,因为bundle已经隔离了类 - 空格。

一种可能的解决方案是提供附加到Restlet-bundle的fragments扩展名。因此,如果你使用bundle-classloader(the documentation说这可以由setting the Engines classloader完成),它就可以从片段中加载类。

答案 2 :(得分:0)

事实上,它对OSGi来说并不适用,因为它取决于能否看到整个类空间。

在OSGi中执行此操作的方法是使用服务注册表进行扩展,但这仅适用于OSGi感知库。

在途中有一些帮助:在最近发布的OSGi 5 (Service Loader Mediator)中,将支持“桥接”META-INF /服务(我不知道Restlet是否使用这些虽然)在OSGi服务上,所以'遗留'库应该在OSGi中运行良好。

Apache Aries中有一个名为Spi-Fly的实现。我暂时看了一会儿。它可能会为你做到,它可能不会。