2011-07-04 10 views
2

Webアプリケーションのクラスパスにあるリソースファイルをいくつか持っています(問題がある場合は、JAR内にあります)。私はそれらのリソースの内容にアクセスすることができます。 SomeClassLoader.getResourceAsStream("/samples/myscript.txt")。私は過去にこれを両方ともテストしましたが爆発未爆破 WARファイルが成功しました。展開されていないWAR内のJAR内のファイルに対してURLConnectionを取得できますか?

しかし、私のアプリで他の既存のクラスと統合するには、そのファイルにURLConnectionオブジェクトを提供する必要があります。私はテストしてgetResource("/samples/myscript.txt").openConnection()が WAR(の結果であることが判明しました)のが爆発したことを確認しました。

質問:その方法は非破壊でも行われます( "パッケージ化?")WARs?

(私は現在、爆発することなく戦争を展開するサーバーに簡単にアクセスすることはできないので、それを徹底的に試すのではなく頼んでいるのです。しかし、爆発的な展開ではなく、展開の展開のように振る舞い、戦争を解きほぐし、正しく動作していることがわかりました。私は過去にWebsphereやWeblogicのような問題を抱えていました。

+0

これは、リソースがWARファイル内のJARファイル内にあることを意味しますか? – Luciano

答えて

1

私はそう信じません。これを行うには、基本URLが別のJAR URLであったJAR URLにJarUrlConnectionを使用する必要があります。もし私がそれを試してみると、私は取得します:

java.net.MalformedURLException: no !/ in spec 

'spec'は、Jar内部のファイルを参照するパスをJarUrlConnectionが呼び出すものです。 jar:jar:file:///outer.jar!/inner.jar!/myscript.txtのようなURLのために、それは最初感嘆符でスペックをオフにチョップして、スペックとしてinner.jar!/myscript.txtを拒否しているようです。実際には、最後の感嘆符のパスで仕様を切り捨てて、内側のURL(外側のJARを参照しています)をベースとして使用しないようにしてください。残念です。私はこれを何とか考えることはできません。アーカイブのエントリ自体でアーカイブ内のエントリは、パッケージの二つの層を有しており、潜在的に圧縮の二つの層を有する:試みられている操作に対して注意すべき

0

何か。中間アーカイブを最外のアーカイブ内のエントリとして残しながらエントリのデータにアクセスしようとすると、エントリを取得する前に中間アーカイブを解凍する必要があります。

が使用されている二重にネストされたアーカイブに二つの基本的なテクニックと1つの高度な技術にアクセスするには:まず、ほとんどの場合、中間のアーカイブは一時ファイルに抽出されます。第二に、中間アーカイブのエントリをストリームすることがありますが、これは非常に遅く、非常に限られた状況を除いては推奨されません。第3に、先進的な手法は、中間アーカイブを圧縮しないで中間アーカイブに最も外側のアーカイブの領域へのポインタでオフセットファイルを作成することです。私はこれがどこでも行われているかどうかはわかりませんが、他の2つのテクニックのオーバーヘッドを避けることができます。いずれの場合においても

、行う簡単なプロトコルハンドラ用のビットくらいです、二重にネストされたエントリにアクセスするために必要なかなりの余分な手順は、があります。

これは、多層アーカイブとして定義されているJavaEEアプリケーションアーカイブ(EAR - >(JAR | WAR | RAR)、WAR - > JARおよびRAR - > JAR)の一般的な問題です。 JavaEEはの3つののネストされたアーカイブを作成します。

関連する問題