1

Tomcat 7 で実行されている Web アプリケーションがあり、クラスの 1 つで、WEB-INF/lib フォルダーの下の jar の 1 つでファイルを読み込もうとしています。

URL resourceURL = MyClass.class.getClassLoader().getResource("xml/xslt/master.xsl");
File xslfile = new File(resourceURL.getPath());
AssertUtil.assertTrue(xslfile.exists(),"xsl file not found");

MyClass と master.xsl の両方が同じ jar に存在し、パッケージ化に問題はありません。xslfile.existsしかし、上記のスニペットは falseを返すため、アサーション ステートメントで失敗します。以下に示すように、URL は jar 内のファイルの場所に正しく解決されます。

file:/<MY_WEBAPP_LOCATION>/MyApp/WEB-INF/lib/MyComponent.jar!/xml/xslt/master.xsl

ここで、MY_WEBAPP_LOCATION は、Tomcat サーバーの webapp ディレクトリへの絶対パスに対応します。

しかし、入力ストリームとして読み取るようにコードを次のように書き直すと、正常に動作します。

InputStream xslFile = MyClass.class.getClassLoader().getResourceAsStream("xml/xslt/master.xsl");

入力ストリームの作成は完全に正常に機能しているのに対し、jar リソースからのファイルの作成を妨げている原因を誰でも説明できますか。jar 内のファイルを読み取るために、Tomcat 側から必要な追加の権限設定はありますか?

編集: ファイルが WEB-INF/classes の下に配置されている場合、上記のコードを使用したファイルの作成は正常に機能します。問題は、WEB-INF/lib の下の jar に配置されている場合のみです。

4

3 に答える 3

0

これは許可の問題ではありませんが、java.io.File API の使用 - 特にコンストラクタhttp://docs.oracle.com/javase/7/docs/api/java/io/File.html#File%28java .lang.String%29

を使用して File オブジェクトを構築している場合

File xslfile = new File(resourceURL.getPath());

「抽象パス名」を期待する java.io.File#File(String) メソッドを使用しています。許容できる/有効なパス名は、File クラスの javadoc で説明されています: http://docs.oracle.com/javase/7/docs/api/java/io/File.html

getPath() メソッドから取得している文字列値:

file:/<MY_WEBAPP_LOCATION>/MyApp/WEB-INF/lib/MyComponent.jar!/xml/xslt/master.xsl

単に有効な「抽象パス名」を構成するものではありません。これは、java.lang.String に変換される URL です (IMHO は、「file」ではなく「jar」の URL スキームで返される必要があります)。したがって、への呼び出し

isExist() 

ディスクにそのような名前のファイルがないため、false を返します。一方、リソースが jar の外にある場合 (例: WEB-INF/classes ディレクトリの下)、resourceURL.getPath() は、問題のリソースが実際には単純なファイルであるため、有効な抽象パス名を表す値を返します。

java.lang.ClassLoader#getResourceAsStream(java.lang.String) を使用すると、メソッドはリソースを java.lang.InputStream に直接ストリーミングし、その実装で File クラスを使用することさえありません。

于 2013-01-28T21:15:11.540 に答える
0

If it is a Desktop application getResource() will work But as this is a web application the resource needs to be extracted from Context , hence getResoruceAsStream()

于 2013-01-28T09:49:59.353 に答える