Java Webアプリケーションに次の構造があります。
TheProject
-- [Web Pages]
-- -- [WEB-INF]
-- -- -- abc.txt
-- -- index.jsp
-- [Source Packages]
-- -- [wservices]
-- -- -- WS.Java
WS.Java
、Webメソッドで次のコードを使用しています。
InputStream fstream = this.getClass().getResourceAsStream("abc.txt");
ただし、常にnullを返します。そのファイルから読み取る必要があります。ファイルをWEB-INF
、getResourceAsStream
でアクセスできますが、メソッドは常にnull
を返します。
私が間違っている可能性のあるアイデアはありますか?
ところで、奇妙なことに、これは機能していましたが、Clean and Build
プロジェクトで、突然動作しなくなりました:/
私の知る限り、ファイルは'this'
クラスが存在するフォルダー内、つまりWEB-INF/classes
内ではなく、さらに深くネストされている必要があります(デフォルトパッケージに記述しない限り)。
net/domain/pkg1/MyClass.Java
net/domain/pkg1/abc.txt
ファイルをJavaソースに入れると動作するはずです。コンパイラはそのファイルをクラスファイルと一緒にコピーします。
Class#getResourceAsStream(String)
への呼び出しはクラスローダーに委任し、リソースはクラスパスで検索されます。つまり、現在のコードは機能しないため、_abc.txt
_を_WEB-INF/classes
_に入れるか、jarファイルにパッケージ化されている場合は_WEB-INF/lib
_に入れる必要があります。
Oruse ServletContext.getResourceAsStream(String)
whichサーブレットコンテナがリソースを利用可能にするクラスローダーを使用せずに、任意の場所からサーブレットに。そのため、これをサーブレットから使用します。
_this.getServletContext().getResourceAsStream("/WEB-INF/abc.txt") ;
_
しかし、WebサービスからgetServletContextを呼び出す方法はありますか?
JAX-WSを使用している場合、WebServiceContext
を注入できます:
_@Resource
private WebServiceContext wsContext;
_
そして、それからServletContext
を取得します:
_ServletContext sContext= wsContext.getMessageContext()
.get(MessageContext.SERVLET_CONTEXT));
_
の代わりに
InputStream fstream = this.getClass().getResourceAsStream("abc.txt");
つかいます
InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt");
このようにして、現在の呼び出しクラスのパスからではなく、ルートから見えるようになります
この方法で「どこからでも」(サーバーの場所を含む)ファイルを取得でき、どこに置くかを気にする必要はないと思います。
通常、そのようなことを気にすることは悪い習慣です。
Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");
これがJAX-WSに当てはまるかどうかはわかりませんが、JAX-RSの場合、ServletContextを挿入してからgetResourceAsStream()を呼び出すことでファイルにアクセスできました。
@Context ServletContext servletContext;
...
InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js");
少なくともGlassFish 3.1では、パスは絶対パスである必要がありました。つまり、スラッシュで始まることに注意してください。詳細: jax-rsでプロパティファイルを使用する方法
Websphere 8.5からWebSphere Libertyに変更したときにも同じ問題が発生しました。
何らかの理由でWebSphere Libertyが_WEB-INF
_フォルダー内のファイルを見つけられないため、getResourceAsStream()
の代わりにFileInputStream
を使用しました。
スクリプトは次のとおりです。
_FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/")
+ "\WEBINF\properties\myProperties.properties")
_
注:このスクリプトは開発用にのみ使用しました。
同様の問題があり、かなり長い間解決策を探しました。文字列パラメーターは大文字と小文字が区別されるようです。したがって、ファイル名がabc.TXTで、abc.txtを検索すると、Eclipseはそれを見つけます-実行可能JARファイルはそれを見つけません。