一个或多个筛选器或者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
因为Lisenter
和Filter
是在容器启动的时候启动的,就需要依赖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实现类没有被编译,所以才会报错.
解决办法 :