2010-02-01 65 views
1

我創建使用Axis2 Web服務客戶端。我想將客戶端打包成一個jar文件,所以我可以在其他幾個項目中使用它。客戶端使用Axis2 WS-Security模塊「壘」。這個模塊,rampart.mar(不是拼寫錯誤!)必須存在於Axis'版本庫路徑'中,位於名爲'modules'的目錄中。客戶端還需要安全策略文件policy.xml。後兩者的位置是通過Spring注入的,但由於它們不會改變,所以我想將它們打包到jar中。包裝一個Spring管理Axis2 Web服務客戶端

如果你注入一個文件對象,如:

<bean id="webserviceStubFactory" class="com.company.WebserviceStubFactory"> 
    <constructor-arg value="classpath:policy.xml"/> 
</bean> 

運行/直接測試項目時,它會工作得很好。然而,當你將其打包爲一個罐子,你會得到

java.io.FileNotFoundException: class path resource [policy.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/path/to/webservice-0.8.jar!/policy.xml

這是一個衆所周知的春天「問題」:構造精氨酸分解爲一個Spring使用ClassPathResource實例,它不支持的GetFile( ),因爲File實例不能引用jar中的內容。對此的解決方案非常簡單:更改構造函數以獲取資源而不是文件並直接使用InputStream。但是,這對於Axis2存儲庫路徑不起作用,因爲我只能指定存儲庫的完整路徑,Axis2內部找出rampart.mar的位置。因此,這個問題基本歸結爲:是否有可能使用Spring在jar中注入路徑(即使它只是/),並讓其他庫從該路徑讀取,就好像它是常規文件系統一樣?我猜測事實並非如此,但我想確定的是,在開發/測試/生產環境中安裝外部'axis存儲庫'之前,有幾個拷貝的rampart.mar應該在周圍。

回答

1

這裏只有這麼多,春天可以做隱藏了底層的JavaSE API的不一致。 Resource接口上的各種getXYZ方法在文檔中出現警告,例如,對於getFile()

Throws: 
    IOException - if the resource cannot be resolved as absolute file path, 
    i.e. if the resource is not available in a file system 

一個JAR內部的資源不是「文件系統上的」,所以這不會有任何效果。

你的情況,你將不得不解決Axis2的要求對文件進行操作,但手動確保文件是否存在。換句話說,使用Resource.getInputStream()提取JAR資源的內容,並將其複製到一個臨時File本地文件系統,然後通過File到Axis2的。

+0

的問題是,Axis2的需要/路徑/到/給予,而它搜索/path/to/modules/rampart.mar。在這種情況下沒有任何文件需要閱讀。另一方面,在jar中傳遞對policy.xml的引用工作得很好,因爲我可以將它作爲Resource傳遞。 在Axis2的來源我看到,它構建了一個完整的URL找到存儲庫中的.mar模塊,但由於某種原因,這是行不通的。由於我可以花費在這個問題上的時間是有限的,我可能會選擇醜陋的解決方案,並在每個使用此項目的項目中包含一個rampart.mar。 :/ – Confusion 2010-02-02 20:11:01