2

我在 Eclipse 中有一个动态 Web 项目。我的 WEB-INF 中有一个文件a.xml存在于类路径中。我Test在我的项目中命名了类。

我在 JSP scriptlet 中有以下代码 -

<%@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 应用程序都有自己的类加载器。这使得在同一个容器上部署两个不同的 web 应用程序并取消部署它们成为可能,即使它们使用同一个库的冲突版本。

webapp 的类加载器是 tomcat 类加载器的子类,它的类路径包含 webapp 的WEB-INF/classes目录,以及WEB-INF/lib. 我不知道你如何设置你的类路径,但你不应该在 eclipse 中设置任何类路径,WEB-INF 目录本身应该绝对不在类路径中。

第一行和第二行基本上是等价的,因为它们都使用 getSstemResource,它使用系统类加载器。他们找不到您的文件是正常的,因为 webapp 的类路径不在系统类路径中。

第三行应该找到该文件,如果它在 webapp 的类路径中,即WEB-INF/classesWEB-INF/lib.

于 2012-11-06T12:23:20.100 回答