2012-09-28 39 views
0

我有一个OSGi包(部署到卡拉夫2.2.4),启动一个骆驼(2.10.0)上下文。骆驼上下文的routebuilder有一定的XQuery端点的URI如驼峰xquery端点与OSGi包uri

"xquery:classpath:Dir1/Dir2/example.xq" 

当上下文试图解决URI,它失败了,因为骆驼包是不是在同一个类路径的.xq文件驻留的位置。所以,我创建了ClassPathScanningCandidateComponentProvider(春季3.1.1)打交道时,一个URL扩展功能,轮流

"xquery:classpath:..." 

"xquery:bundle://42.0:6/..." 

,因为我已经在我的项目涉及捆绑的URI和OsgiBundleResourcePatternResolver更早。不幸的是,我似乎无法找到使骆驼的XQueryComponent使用我的OsgiBundleResourcePatternResolver的方法。

  1. 我该说的是正确的方法吗?有没有更简单的方法来做到这一点?
  2. 如果我是,我怎样才能确保XQueryComponent可以理解一个bundle:的URI?
  3. 另外,是否有可能让我确定任何骆驼组件都可以理解一个bundle: URI?

回答

0

感谢Claus的回答,我能够意识到我的.xq文件不在它的.jar的正确目录中。

Dir1驻留在它的.jar文件的根目录下。虽然在非OSGi网络容器中运行应用程序运行良好,但Karaf似乎对我的.war文件中的资源应该更加严格。我将.xq文件移动到WEB-INF/classes/Dir1/...,现在我不再接收FileNotFoundExceptions当代码使用xquery:classpath:Dir1/Dir2/example.xq

2

具有上述xquery端点的Camel路由的应用程序需要导入xq文件所在的软件包,例如代表“Dir1.Dir2”的软件包。

因此在具有OSGi导入|导出的META-INF/MANIFEST.MF中。您应该为该指定软件包提供导入。

并回答你的3发子弹

  1. 没有见上
  2. 您需要扩展这个组件,并添加自己的逻辑为“捆绑”
  3. 没有,真的没有,因为你需要将逻辑添加到camel-core/camel-core-osgi。

另外,应用程序的包ID可以更改,因此不建议通过其ID来引用包。而且你不能分配bundle id,这是由osgi容器自己分配的。

+0

虽然Camel包是分开的,但Camel * context *和它的routebuilder与.xq文件位于同一个包中。我已经写了我的问题,假设它是访问.xq文件的Camel包的问题,​​但是您的答案让我相信这不是问题。如果routebuilder和.xq在同一个包中,他们不应该已经能够看到对方吗? – Ski