項目中有時候會遇到jar包沖突的問題, 報以下異常
Servlet.service() for servlet [jsp] in context with path [] threw exception [java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;] with root cause
java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/Jsp
是因為 jasper-compiler.jar jasper-runtime.jar 這幾個jar包的問題,
因為tomcat6中沒有這幾個jar包, tomcat7卻自帶了這幾個jar包, 當項目從tomcat6移到tomcat7時, 就會報jar包沖突的錯誤, 這時候我們經(jīng)常的選擇是刪除項目中的jar包,
后來發(fā)現(xiàn)在tomcat的context.xml中配置一個參數(shù) <Loader delegate='true' />, 就可以解決,
原因
True,表示tomcat將遵循JVM的delegate機制,即一個WebAppClassLoader在加載類文件時,會先遞交給SharedClassLoader加載,SharedClassLoader無法加載成功,會繼續(xù)向自己的父類委托,一直到BootstarpClassLoader,如果都沒有加載成功,則最后由WebAppClassLoader自己進行加載。
False,表示將不遵循這個delegate機制,即WebAppClassLoader在加載類文件時,會優(yōu)先自己嘗試加載,如果加載失敗,才會沿著繼承鏈,依次委托父類加載。