zoukankan      html  css  js  c++  java
  • 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的话,这就有可能会导致很多奇怪的问题。

  • 相关阅读:
    51单片机寄存器组的设置(转)
    51单片机堆栈深入剖析(转)
    do{...}while(0)的妙用(转)
    优化C/C++代码的小技巧(转)
    Struts2返回json
    详略。。设计模式1——单例。。。。studying
    [深入理解Android卷一全文-第十章]深入理解MediaScanner
    《python源代码剖析》笔记 Python虚拟机框架
    jQuery Validation让验证变得如此easy(三)
    mysql高可用架构方案之中的一个(keepalived+主主双活)
  • 原文地址:https://www.cnblogs.com/taleche/p/8709054.html
Copyright © 2011-2022 走看看