gpt4 book ai didi

java - JSP 的类加载过程是怎样的?

转载 作者:行者123 更新时间:2023-11-30 09:30:29 25 4
gpt4 key购买 nike

我在 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");

我感兴趣的是了解上述场景,而不是加载该文件的各种方法。

最佳答案

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

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

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

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

关于java - JSP 的类加载过程是怎样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13250807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com