2011-07-04 74 views
2

我有一些資源文件位於我的Web應用程序的類路徑中(如果是這樣的話,在JAR中)。我知道我可以通過撥打這些資源來訪問這些資源的內容。 SomeClassLoader.getResourceAsStream("/samples/myscript.txt")。我已經在過去測試過這兩個爆炸未爆炸成功的WAR文件。我可以在非爆炸WAR中的JAR內獲得URLConnection嗎?

但是,爲了與我的應用程序中的其他一些現有類集成,我需要爲該文件提供一個URLConnection對象。我測試並確認,調用getResource("/samples/myscript.txt").openConnection()工程爆炸 WAR(另外,調試發現,結果是file:///到爆炸文件的URL)。

問題:該方法是否也可以工作不爆炸(「打包?」)WAR? (我目前不能輕鬆訪問部署戰爭而不爆炸它們的服務器,因此我爲什麼要問,而不是直接嘗試它。此外,一些服務器(例如Jetty,Tomcat - 即使使用unpackWARs="false")也允許非爆炸式的部署,但在幕後他們打開了戰爭的包裝,有效地表現爲像爆炸式部署 - 顯然,正常工作。我認爲過去給我帶來麻煩的服務器是Websphere和Weblogic)。

+0

您的意思是說資源位於WAR文件內部的JAR文件中? – Luciano

回答

1

我不這麼認爲。要做到這一點,您必須使用JarUrlConnection作爲其基礎URL是另一個JAR URL的JAR URL。如果我嘗試,我得到:

java.net.MalformedURLException: no !/ in spec 

「規範」是什麼JarUrlConnection調用指的是JAR裏面的文件的路徑。看起來對於像jar:jar:file:///outer.jar!/inner.jar!/myscript.txt這樣的URL,它會刪除第一個感嘆號中的規範,然後拒絕inner.jar!/myscript.txt作爲規範。實際上,我們希望它在最後一個感嘆號路徑中切掉規範,解開內部URL(它指向外部JAR!)以用作基礎。不幸的。我想不出任何方法。

0

需要注意的是與正在嘗試的操作有關的內容:歸檔文件中的條目本身是歸檔條目,具有兩層包裝,並且可能具有兩層壓縮。任何嘗試訪問該條目的數據而留下中間檔案仍然作爲最外檔案中的條目時,必須在檢索條目之前解壓縮中檔檔案。

要訪問雙重嵌套存檔,需要使用兩種基本技巧和一種高級技術:首先,大多數情況下,中間存檔會被提取到臨時文件。其次,偶爾可以通過中間存檔的條目進行流式處理,但這非常緩慢,除非在非常有限的情況下才建議。第三,先進技術是不壓縮中間檔案,然後用指向最外檔案的區域的指針創建偏移文件到中間檔案。我不確定這是在任何地方完成的,但它可以避免其他兩種技術的開銷。

在任何情況下,訪問雙重嵌套條目都需要相當多的額外步驟,這對於簡單的協議處理程序來說是非常有用的。

還請注意,這是JavaEE應用程序歸檔的常見問題,這些歸檔定義爲多層歸檔:EAR - >(JAR | WAR | RAR),WAR - > JAR和RAR - > JAR。 JavaEE創建三個嵌套存檔的層。