一個或多個篩選器或者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


免責聲明!

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



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