JSP的类加载过程是什么?

时间:2012-11-06 12:12:32

标签: java jsp classloader

我在eclipse中有一个动态的web项目。我的WEB-INF中有一个文件a.xml,它存在于classpath中。我的项目中有一个名为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");

我有兴趣了解上述情况,而不是加载该文件的各种方法。

1 个答案:

答案 0 :(得分:2)

每个部署的Web应用程序都有自己的类加载器。这就是使得在同一容器上部署两个不同的webapp并取消部署它们的可能性,即使它们使用相同库的冲突版本也是如此。

webapp的类加载器是tomcat类加载器的子代,其类路径包含webapp的WEB-INF/classes目录,以及WEB-INF/lib中的每个jar文件。我不知道你是如何设置类路径的,但你不应该在eclipse中设置任何类路径,并且WEB-INF目录本身应该不在类路径中。

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

第三行应该找到该文件,如果它在webapp的类路径中,即在WEB-INF/classes下或WEB-INF/lib下的jar中。