2012-09-28 40 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