1. 程式人生 > >tomcat jar 包 與 專案jar包衝突問題解決

tomcat jar 包 與 專案jar包衝突問題解決

專案中有時候會遇到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包衝突的錯誤, 這時候我們經常的選擇是刪除專案中的jar包,

後來發現在tomcat的context.xml中配置一個引數 <Loader delegate="true" />, 就可以解決,

原因

True,表示tomcat將遵循JVM的delegate機制,即一個WebAppClassLoader在載入類檔案時,會先遞交給SharedClassLoader載入,SharedClassLoader無法載入成功,會繼續向自己的父類委託,一直到BootstarpClassLoader,如果都沒有載入成功,則最後由WebAppClassLoader自己進行載入。
False,表示將不遵循這個delegate機制,即WebAppClassLoader在載入類檔案時,會優先自己嘗試載入,如果載入失敗,才會沿著繼承鏈,依次委託父類載入。