現(xiàn)象:
啟動(dòng)Tomcat
刪除 CATALINA_HOME/work/ 目錄下的Catalina目錄
訪問(wèn)任何一個(gè)jsp文件,將發(fā)生錯(cuò)誤
org.apache.jasper.JasperException: org.apache.jasper.JasperException: Unable to load class for JSP
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:156)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
原因:
Tomcat對(duì)jsp的處理是由一個(gè)JspServlet來(lái)完成的,當(dāng)tomcat啟動(dòng)時(shí),會(huì)為每一個(gè)context創(chuàng)建jsp工作目錄(work dir),存放地為 CATALINA_HOME/work/Catalina/HOST_NAME/CONTEXT_NAME,context編譯jsp所需要的參數(shù)也隨之初始化,加載jsp class的base path也已經(jīng)潛在初始化,是一個(gè)File對(duì)象,它將在隨后URLClassLoader加載jsp class時(shí)作為一個(gè)resource url,下面是部分代碼:
org.apache.jasper.JspCompilationContext.java
初始化 JspLoader










其中baseUrl是這樣得到的























options.getScratchDir() 是在tomcat啟動(dòng)時(shí)初始化的,于是,啟動(dòng)tomcat后,刪除work目錄,訪問(wèn)jsp時(shí),盡管work目錄被重新創(chuàng)建并且jsp被成功編譯,但是由于ClassLoader中原目錄對(duì)象與當(dāng)前目錄對(duì)象不同,而無(wú)法加載到j(luò)sp的class