• 一个或多个筛选器或者Listeners启动失败 的问题探索以及解决方案


    2020年10月9日更新

    经过本人对SSM框架理解的加深和对IDEA工具使用的熟悉,现提出一种新的解决办法,以前的解决办法可能存在问题

    1. 问题描述:

    使用IDEA作为开发工具,使用Maven作为项目管理工具,完成一个web项目后使用Tomcat作为服务器启动项目,报错一个或多个筛选器启动失败或者org.apache.catalina.core.StandardContext.startInternal 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件,错误原因应该是一致的.

    2. 根本原因:

    项目部署运行环境下,项目依赖的jar包没有导入到项目部署的环境中,说白话就是部署环境中缺少jar包

    3. 出现的可能原因:

    创建Maven项目时,没有选择Maven提供的架构,创建的普通Maven项目,创建完成后再为项目添加web框架支持导致的,这样创建的项目IDEA不会自动添加项目依赖的jar包到WEB-INF/lib目录.所以创建web项目时,如果要使用Maven作为项目管理工具,尽量选择Maven提供的项目架构即可避免

    4. 解决办法:

    把缺少的jar包导入即可,WEB-INF目录下新建lib文件夹,右键选择Add copy of-->Library File,将项目所有需要的依赖添加即可.如下图所示

    具体操作(针对于IDEA开发工具)

    总结:

    从图示中可以看出,如果缺少lib文件夹或者你的classes文件夹同级目录不存在你的项目依赖的话,项目部署之后的环境中,java类是找不到依赖的jar包的.

    所以就会出现以下问题

    1. 如果项目配置了监听器Listener,项目启动会失败,报错org.apache.catalina.core.StandardContext.startInternal 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件

    2. 如果项目配置了过滤器Filter, 项目启动会失败,报错一个或多个筛选器启动失败

    3. 如果项目没有配置以上两种,那么在访问需要依赖别的jar包的java程序时就会报错ClassNotFoundException

    因为LisenterFilter是在容器启动的时候启动的,就需要依赖jar包,如果找不到,容器就会启动失败,普通Java程序是在第一次访问的时候才会被调用,所以会在访问时报错

    --------------------------------以下为原文章-----------------------------------

    问题描述:

    做一个字符编码过滤器.注册xml后,Tomcat启动web项目提示如下错误信息 :

    org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。

    web.xml 中的注册信息注释项目能正常运行,所以怀疑是过滤器的问题

    CharacterEncodingFilter.java
    package com.shme.filter;
    
    import javax.servlet.*;
    import java.io.IOException;
    /**
     * @Desc 字符编码过滤器
     */
    public class CharacterEncodingFilter implements Filter{
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("CharacterEncodingFilter过滤器初始化");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
            //设置utf-8
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html");
            response.setCharacterEncoding("utf-8");
    
            chain.doFilter(request,response);
        }
    
        @Override
        public void destroy() {
            System.out.println("CharacterEncodingFilter过滤器销毁");
        }
    }
    
    web.xml (3.1版本)
    <!--字符编码过滤器-->
        <filter>
            <filter-name>charset</filter-name>
            <filter-class>com.shme.filter.CharacterEncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>charset</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    

    解决办法 :

    原因 :

    使用Maven创建项目,IDEA部署到Tomcat服务器时,在本人的开发环境中会有几率遇到不编译java文件夹下的java源文件,导致tomcat在部署项目时, Filter需要优先启动,在web.xml中寻找映射时,项目文件中Filter实现类没有被编译,所以才会报错.

    解决办法 :

    参考本人的另一篇文章 https://www.cnblogs.com/shmebluk/p/13192777.html

  • 相关阅读:
    流程控制语句
    lminus
    TCL create list from file
    DFT 问答 III
    DFT 问答 II
    DFT 问答 I
    猜字符小游戏
    用户模式构造
    基元线程同步构造
    七大原则,24种设计模式
  • 原文地址:https://www.cnblogs.com/juyss/p/13191821.html
Copyright © 2020-2023  润新知