2

私はEclipseで動的Webプロジェクトを持っています。a.xmlクラスパスに存在するWEB-INFにファイルがあります。Test私のプロジェクトで名前が付けられたクラスがあります。

JSPスクリプトレットに次のコードがあります-

<%@page import="com.kshitiz.Test"%>
<%
System.out.println(ClassLoader.getSystemClassLoader().getSystemResource("a.xml"));
System.out.println(this.getClass().getClassLoader().getSystemResource("a.xml"));
System.out.println(Test.class.getClassLoader().getResource("a.xml"));
%>

出力は -

null
null
C:/Users/kshitiz/eclipse/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/test-project/WEB-INF/classes/a.xml

システム クラス ローダと JSP クラスローダがファイルを見つけられないようです。

出力について説明していただけますか?Tomcat は別のクラスローダーを使用して JSP をロードしていますか? なんでそうなの?システム クラスローダがファイルを見つけられないのはなぜですか?

以下を使用して自分のファイルにアクセスできることはすでに知っています-

getServletContext().getResourceAsStream("/WEB-INF/a.xml");

そのファイルをロードするためのさまざまな方法ではなく、上記のシナリオを理解することに興味があります。

4

1 に答える 1

2

デプロイされた各Webアプリケーションには、独自のクラスローダーがあります。これにより、同じライブラリの競合するバージョンを使用している場合でも、2つの異なるWebアプリケーションを同じコンテナにデプロイしてアンデプロイすることが可能になります。

webappのクラスローダーはtomcatクラスローダーの子であり、そのクラスパスにはwebappのWEB-INF/classesディレクトリと。内のすべてのjarファイルが含まれていますWEB-INF/lib。クラスパスをどのように設定するかはわかりませんが、eclipseにクラスパスを設定しないでください。また、WEB-INFディレクトリ自体がクラスパスに含まれていないことを確認してください。

1行目と2行目は、どちらもシステムクラスローダーを使用するgetSstemResourceを使用しているため、基本的に同等です。Webアプリケーションのクラスパスがシステムのクラスパスにないため、ファイルが見つからないのは正常です。

3行目は、ファイルがWebアプリケーションのクラスパスにある場合、つまり、の下WEB-INF/classesまたはjarの下にある場合にファイルを見つける必要がありますWEB-INF/lib

于 2012-11-06T12:23:20.100 に答える