2009-04-27 51 views
7

我有一個J2EE應用程序作爲EAR文件部署,而EAR文件又包含用於業務層代碼(包括一些EJB)的JAR文件和用於Web層代碼的WAR文件。 EAR文件被部署到JBoss 3.2.5,它解壓縮EAR和WAR文件,但不包括JAR文件(這不是問題,僅僅是供參考)。在EAR中獲取JAR文件的絕對路徑?

JAR文件中的一個文件是MS Word模板,其絕對路徑需要傳遞給某些本地MS Word代碼(使用Jacob,FWIW)。

的問題是,如果我試圖獲得這樣的文件(從JAR文件中的一些代碼中):

URL url = getClass().getResource("myTemplate.dot"); 
File file = new File(url.toURI()); // <= fails! 
String absolutePath = file.getAbsolutePath(); 
// Pass the absolutePath to MS Word to be opened as a document 

...那麼java.io.File構造函數拋出拋出:IllegalArgumentException「URI不分層」。該URL和URI都具有相同的toString()輸出,即:

jar:file:/G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents/myapp.jar!/my/package/myTemplate.dot 

這多路徑的是在文件系統上有效,但不休息(即內部的JAR文件):

G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents 

獲取此文件絕對路徑的最簡單方法是什麼?

回答

7

我目前的解決方案是將文件複製到服務器的臨時目錄中,然後用複製的絕對路徑:

File tempDir = new File(System.getProperty("java.io.tmpdir")); 
File temporaryFile = new File(tempDir, "templateCopy.dot"); 
InputStream templateStream = getClass().getResourceAsStream("myTemplate.dot"); 
IOUtils.copy(templateStream, new FileOutputStream(temporaryFile)); 
String absolutePath = temporaryFile.getAbsolutePath(); 

我寧願不涉及複製文件的解決方案。

+0

當我發現這個問題,我的第一想法是「是的,也許唯一的辦法是寫一個臨時文件!」。令人驚訝的是,這是唯一的方法!怎麼可能無法在jar中處理路徑?如果你能得到流,你可以在完美的世界中獲得文件。 – 2011-03-10 16:00:55

1

除非代碼或應用程序要傳遞的URI的字符串,以接受指定JAR/ZIP文件中的位置的格式,您將文件複製到一個臨時位置的解決方案可能是最好的一個。

如果經常引用這些文件,您可能需要緩存提取文件的位置,並在每次需要時驗證其存在位置。

+0

謝謝克里斯。我非常確定Word需要一個絕對路徑,並且會被JAR/ZIP風格的路徑所迷惑。我實在懶,將原始文件複製到臨時文件夾,我只是離開了那我的答案簡潔的緣故。 – 2009-04-27 01:10:13

0

您應該將內容複製到臨時文件(可能包含緩存),因爲嘗試訪問應用程序容器的內部文件是您要避免的依賴關係。甚至可能根本沒有提取的文件(它可以直接從JAR加載)。

相關問題