我们创建一个简单的Web应用,里面只有一个HelloWorldServlet,然后在这个Servlet中打印加载它的ClassLoader,代码如下:
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorldServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response){
ClassLoader classLoader = this.getClass().getClassLoader();
while (classLoader!=null){
System.out.println(classLoader.getClass().getCanonicalName());
classLoader = classLoader.getParent();
}
}
}
将这个web应用通过方式配置在server.xml中,代码如下
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path = "/examples" docBase = "E:\workspace\webTest" reloadable = "true"/>
上面这段代码打印出来:
org.apache.catalina.loader.WebappClassLoader
org.apache.catalina.loader.standardClassLoader
sun.misc.Launcher$AppClassLoader
sum.misc.Launcher$ExtClassLoader
可见,是由WebappClassLoader
加载的。
如果,将一个web应用直接放在webapp目录下,那么tomcat就通过standardClassLoader
直接加载,而不是通过WebappClassLoader
来加载。