我们在 OSGi 环境 (Equinox) 中将 Restlet 2.1 作为包运行(即,不作为包中的库)。问题是 Restlet 引擎没有检测到由 Restlet 扩展提供的帮助程序(如转换器)。具体来说,EngineClassLoader#getResources()
调用不会返回任何结果。这些扩展也部署为目标平台中的 OSGi 包。
自动转换器注册实际上应该在 OSGi 环境中工作吗?
我们在 OSGi 环境 (Equinox) 中将 Restlet 2.1 作为包运行(即,不作为包中的库)。问题是 Restlet 引擎没有检测到由 Restlet 扩展提供的帮助程序(如转换器)。具体来说,EngineClassLoader#getResources()
调用不会返回任何结果。这些扩展也部署为目标平台中的 OSGi 包。
自动转换器注册实际上应该在 OSGi 环境中工作吗?
事实上,Restlet 支持这样的功能要归功于专用的激活器(请参阅包 org.restlet.engine.internal 中的 Activator 类)。
这个激活器自省包以找出以下内容:
请注意,要使用此功能,我们必须使用 Restlet 的 OSGi 版本,因为它是唯一具有 org.restlet 包的 MANIFEST 文件并指定了激活器类的文件。否则你不必关心捆绑加载顺序......
希望它可以帮助你。蒂埃里
除非 Restlet-bundle 显式地导入包含扩展的包(我怀疑它确实如此,而且它不应该),否则它将无法加载它们,因为包具有隔离的类空间。
一种可能的解决方案是将扩展作为附加到 Restlet 捆绑包的片段提供。因此,如果你让它使用 bundle-classloader (文档说这可以通过设置Engine
s 类加载器来完成),它将能够从片段中加载类。
事实上,它对 OSGi 不太适用,因为它取决于查看整个类空间的能力。
在 OSGi 中执行此操作的方法是将服务注册表用于扩展,但这仅适用于 OSGi 感知库。
有一些帮助:在最近发布的OSGi 5(服务加载器中介)中,将支持将 META-INF/服务(我不知道 Restlet 是否使用这些)“桥接”到 OSGi 服务上,所以'legacy' 库应该在 OSGi 中运行良好。
Apache Aries 中有一个名为Spi-Fly的实现。不久前我简单地看了看它。它可能对你有用,它可能不会。