tomcat啟動問題 嚴重: End event threw exception


錯誤信息:

嚴重: End event threw exception

java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet

    at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:849)

...................(略)

四月 03, 2018 2:43:22 下午 org.apache.catalina.startup.ContextConfig parseWebXml

嚴重: Parse error in application web.xml file at file:/D:/apps/apache-tomcat-7.0.71/conf/web.xml

org.xml.sax.SAXParseException; systemId: file:/D:/apps/apache-tomcat-7.0.71/conf/web.xml; lineNumber: 115; 

..........................(略)

四月 03, 2018 2:43:22 下午 org.apache.catalina.startup.ContextConfig parseWebXml

嚴重: Occurred at line 115 column 15

四月 03, 2018 2:43:22 下午 org.apache.tomcat.util.digester.Digester endElement

嚴重: End event threw exception

解決辦法:

在tomcat下conf中context.xml文件配置<Loader delegate="true" />。

分析:

JVM的classloader加載繼承關系分為BootstarpClassLoader --> ExtClassLoader --> SystemClassLoader,應用的WebAppClassLoader繼承自SystemClassLoader,在加載具體某個類時,一般會先委托給父類ClassLoader,當父類ClassLoader無法加載成功時,才會再由子類ClassLoader嘗試加載,這就是所謂的delegate機制。

其次,Tomcat在jvm的ClassLoader機制上增加了幾個繼承層次。
SystemClassLoader --> CommonClassLoader -->(ServerClassLoader | SharedClassLoader --> WebAppClassLoader)。
CommonClassLoader用來加載${CATALINA_HOME}/conf/catalina.properties中common.loader配置目錄下的類文件,一般是用來加載${CATALINA_HOME}/lib下的文件。該loader加載的類為tomcat服務器和tomcat下面的所有webApp所共享。
ServerClassLoader用來加載${CATALINA_HOME}/conf/catalina.properties中server.loader配置目錄下的類文件,一般是用來加載${CATALINA_HOME}/server下的文件。該loader加載的類為tomcat服務器所獨有核心類,tomcat下面的WebApp無法訪問。
SharedClassLoader用來加載${CATALINA_HOME}/conf/catalina.properties中shared.loader配置目錄下的類文件,一般是用來加載${CATALINA_HOME}/shared下的文件。該loader加載的類為tomcat下面的所有webApp所共享。
WebAppClassLoader用來加載${CATALINA_HOME}/webapps/目錄下每個WebApp應用的/WEB-INF/class,/WEB-INF/lib的類文件,每個WebApp對應一個WebAppClassLoader,用來加載其所需要的類文件。

最后,說一下delegate配置的意義。
True,表示tomcat將遵循JVM的delegate機制,即一個WebAppClassLoader在加載類文件時,會先遞交給SharedClassLoader加載,SharedClassLoader無法加載成功,會繼續向自己的父類委托,一直到BootstarpClassLoader,如果都沒有加載成功,則最后由WebAppClassLoader自己進行加載。
False,表示將不遵循這個delegate機制,即WebAppClassLoader在加載類文件時,會優先自己嘗試加載,如果加載失敗,才會沿着繼承鏈,依次委托父類加載。

在此說一下配置為False需要注意的問題:一旦配置為False,如果你在WebApp中自己定義了一個java.lang.String,則這個String類會有可能覆蓋掉jdk中的String類,這也許不是你想要的結果。另外對於多個WebApp公用jar包,你可能會放到${CATALINA_HOME}/shared目錄中共享,但是一不小心在應用的/WEB-INF/lib中也包含了一個同名的但版本不一致的jar的話,這就有可能會導致很多奇怪的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM