1

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

自动转换器注册实际上应该在 OSGi 环境中工作吗?

4

3 回答 3

1

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

这个激活器自省包以找出以下内容:

  • 与注册服务器对应的服务器
  • 与注册客户端对应的服务器
  • 与注册客户端对应的身份验证器
  • 转换器

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

希望它可以帮助你。蒂埃里

于 2012-12-03T17:44:36.790 回答
0

除非 Restlet-bundle 显式地导入包含扩展的包(我怀疑它确实如此,而且它不应该),否则它将无法加载它们,因为包具有隔离的类空间。

一种可能的解决方案是将扩展作为附加到 Restlet 捆绑包的片段提供。因此,如果你让它使用 bundle-classloader (文档说这可以通过设置Engines 类加载器来完成),它将能够从片段中加载类。

于 2012-11-29T09:34:15.873 回答
0

事实上,它对 OSGi 不太适用,因为它取决于查看整个类空间的能力。

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

一些帮助:在最近发布的OSGi 5(服务加载器中介)中,将支持将 META-INF/服务(我不知道 Restlet 是否使用这些)“桥接”到 OSGi 服务上,所以'legacy' 库应该在 OSGi 中运行良好。

Apache Aries 中有一个名为Spi-Fly的实现。不久前我简单地看了看它。它可能对你有用,它可能不会。

于 2012-11-30T10:06:57.487 回答