1、問題場景描述:一個maven項目啟動時候,偶爾會報tomcat的這個錯誤(如圖:)
隨機報錯,有時頻率很高,要一直重新啟動很多次可能還是啟動不了,有時不報錯。。
2、解決過程:網上各種尋找解決辦法,大部分說的是servlet-api的jar包版本和項目使用的tomcat版本不對應,然后去找了一下servlet-api的jar包版本和tomcat版本的對應關系,
發現servlet-api的jar包版本和tomcat版本是對應的,此工程使用的是tomcat7組件,pom文件中
本地倉庫中的servlet-api的jar包
是符合對應要求的,說明不是這個問題,開始了解學習tomcat的standardEngine和standardHost這兩個類的源碼,
a、StandardHost類是Host接口的默認實現;其繼承自ContainerBase類,說明他也是一個容器類,既然是容器類,那肯定也有管道對象PipeLine和閥門,其基礎閥門(Basic Valve)的實現類是org.apache.catalina.core.StandardHostValve,ErrorReportValve和ErrorDispatcherValve類作為管道對象中的錯誤處理閥門;
b、當客戶端的請求Request要在Host中查找到相應的Context處理請求時,就需要使用mapper對象處理,StandardHost中的mapper實現類是org.apache.catalina.core.StandardHostMapper;當ContainerBase.start啟動時會調用addDefaultmapper添加默認的映射器,也就會調用到StandardHost.addDefaultmapper方法:
c、Engine容器也就是tomcat的servlet引擎,StandardEngine類是Engine接口的默認實現;當部署tomcat時需要支持多個虛擬機的話,就需要使用engine容器,事實上,一般情況下,部署的tomcat都會使用一個Engine容器;
d、StandardEngineValve類作為StandardEngine類的基礎閥門(Basic Valve),其invoke方法負責查找出對應的Host出來並交由host處理;
......了解了個大概,再回頭看下原來的報錯,大概知道是啟動時候類似於類加載的問題,涉及的很多多個項目工程共用的jar包和單獨有的jar包問題等等,需要使用catalina.properties配置文件,經行一些共用和單獨使用的一些jar包進行管理,部署一些公用類設置,類加載設置等等:
講catalina.properties文件放在target文件的tomcat文件夾中的conf配置文件夾目錄下,catalina.properties文件其實就是公貓即tomcat的內部腳本文件。
問題解決。
附加上這個catalina.properties附件的地址 https://files.cnblogs.com/files/wmqiang/catalina.zip