Tomcat啟動異常:A child container failed during start 與 ClassNotFoundException: org.slf4j.Loggerl分析與解決方法


原文鏈接:https://blog.csdn.net/chenchunlin526/article/details/75229006

 

情境:

  在eclipse導入Maven項目的時候,出現了以下的錯誤: 其中最主要的錯誤是:Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger

嚴重: A child container failed during start

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException:  

Failed to start component [StandardEngine[Catalina].StandardHost[localhost]. 

StandardContext[/patyee]]

    at java.util.concurrent.FutureTask.report(FutureTask.java:122)

    at java.util.concurrent.FutureTask.get(FutureTask.java:192)

......

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

Caused by: org.apache.catalina.LifecycleException: Failed to start component

 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/patyee]]

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)

    ... 6 more

Caused by: java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;

    at java.lang.Class.getDeclaredFields0(Native Method)

    at java.lang.Class.privateGetDeclaredFields(Class.java:2583)

    at java.lang.Class.getDeclaredFields(Class.java:1916)

......

    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)

    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5405)

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

    ... 6 more
 Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger

    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1854)

    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1703)

    ... 20 more

七月 17, 2017 10:42:49 上午 org.apache.catalina.core.ContainerBase startInternal

嚴重: A child container failed during start

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to 

start component  [StandardEngine[Catalina].StandardHost[localhost]]

    at java.util.concurrent.FutureTask.report(FutureTask.java:122)

    at java.util.concurrent.FutureTask.get(FutureTask.java:192)

    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)

     ......

    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)

    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:428)

Caused by: org.apache.catalina.LifecycleException: Failed to start component 

[StandardEngine[Catalina].StandardHost[localhost]]

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)

    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574)

    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564)

    at java.util.concurrent.FutureTask.run(FutureTask.java:266)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

    at java.lang.Thread.run(Thread.java:745)

Caused by: org.apache.catalina.LifecycleException: A child container failed during start

    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1130)

    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:819)

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

    ... 6 more

七月 17, 2017 10:42:49 上午 org.apache.catalina.startup.Catalina start

嚴重: The required Server component failed to start so Tomcat is unable to start.

org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)

    at org.apache.catalina.startup.Catalina.start(Catalina.java:689)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.lang.reflect.Method.invoke(Method.java:498)

    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)

    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:428)

......

解決辦法:

分析:先檢查項目的配置是否都正確. 

一、【配置項目屬性】項目右鍵--->properties

① 先檢查Java Build Path

 

 

 

 

 ②檢查Java Compiler

 

 

 

③檢查Project Facets中的Java等級,與tomcat配置。

在搜索框中,搜索facet

 

 

 

 二、【全局tomcat配置】Window ---> Preferencs ---> Server --->Runtime Environments

④檢查tomcat配置

 

 

 

 

 

 到此為止,如果你發現你上面的配置都是正確的(主要是jdk版本要一致,包括tomcat的jdk),但是還是報錯,那是什么原因呢?

我們先來看一下報錯的信息:

嚴重: A child container failed during start

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/patyee]]

 

A child container failed during start 意思是說“啟動一個子容器失敗”。

那么這個子容器指的是什么?

其實這個子容器指的是你部署項目的tomcat,雙擊tomcat你會看見tomcat的配置。

 

 

 

 

Server Locations:(默認選擇第一項Use workspace metadata(does not modidy Tomcat installation))就是我們部署項目用的tomcat的位置,它的本質是我們在本地安裝的一個tomcat的一個副本(默認復制了本地的tomcat到Eclipse的工作空間的文件夾里來)。這里的配置不要改動,使用tomcat的副本進行項目部署,不會改變我們本地安裝的tomcat的配置。可以單獨在副本里進行各種修改。


-------------------------------------------

普及一下tomcat在Eclipse中的配置知識:

(關於Eclipse中tomcat的配置,路徑的選擇的區別,我會再寫一篇詳細的文章。)

比如我本地tomcat安裝在D盤:

D:\apache-tomcat-7.0.65

 

 

但是我們項目部署的地方,卻不是在D盤,而是在Eclipse的工作空間中,

具體路徑為:

D:\Workspaces\eclipse_luna\.metadata\.plugins\org.eclipse.wst.server.core

這里面有很多tmp, 這些就是Eclipse自動為我們copy的一個tomcat副本。

其實可以發現兩個文件夾里的內容基本一樣,其本質:tmp5就是D盤D:\apache-tomcat-7.0.65的一個副本,稱之為“子容器”。

-----------------------------------------

版權聲明:本文為博主(chunlynn)原創文章,轉載請注明出處 https://blog.csdn.net/chenchunlin526/article/details/75229006

我們的項目就部署在這里:

D:\Workspaces\eclipse_luna\.metadata\.plugins\org.eclipse.wst.server.core\tmp5\wtpwebapps\patyee

jar包在這里:

D:\Workspaces\eclipse_luna\.metadata\.plugins\org.eclipse.wst.server.core\tmp5\wtpwebapps\patyee\WEB-INF\lib

 

 這里面的jar包只有13個,全都是項目WEB-INF/lib目錄下已有的。

 

 

啟動子容器失敗,指的就是啟動tmp5這個tomcat容器失敗。

然后報錯信息中有一句Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger

說是找不到類,貌似是缺少slf4j的jar包。

哈哈,現在進入異常的解決方案:

我查看一下是否少了slf4j的jar包:

哈哈,現在進入異常的解決方案:

我查看一下是否少了slf4j的jar包:

 

 

maven庫中並沒有少啊!

那是什么鬼呢??

實際上報這個錯的,肯定是Eclipse+tomcat+maven項目,強調一遍,肯定是Maven項目

解決方法如下:

項目右鍵 ---> properties

Deployment Assembly設置【web部署部件】:

 

 

 

 

 

 

 

 

把maven庫中的jar包添加到項目部署部件中。

至此問題解決!前面說那么多,主要為了“授之以漁”。不只是告訴你解決方案,而是告訴你怎么分析!

你在maven中管理jar包,但是你用tomcat運行項目時,maven本地庫中的jar包並沒有發布到tomcat容器中。所以你在項目的發布目錄的WEB-INF/lib下,是找不到托管在maven中的jar包的。通過上面的Deployment Assembly設置后,啟動tomcat,重新進入到tmp5中進行查看,WEB-INF/lib中已經包含了81個jar包,而這些jar包,除了那13個,其余的都是是我們在pom.xml,即maven中托管的jar包,現在已經全部發布到tomcat容器了,這樣tomcat就正常啟動了。

 

 

再普及一個知識:Eclipse的WebContent目錄,或者MyEclipse的WebRoot目錄就是項目發布輸出的最終目錄。當項目發布到tomcat后,WebContent 會更名為項目名,里面包含靜態文件以及.java被編譯成字節碼的.class文件。

編譯后的Java文件在這里,編譯后.java文件全都變成字節碼文件(.class)了。

 

 


 

 

 

 

-----------------------------補充一個其他網友遇到的相似的異常信息的解決方案----------------------------

問題描述3:tomcat啟動報錯,報:A child container failed during start ,並且異常信息包含有 Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> * in servlet mapping

原因:已經發布到tomcat上的某個項目的servlet過濾器配置錯誤。
如在web.xml下,將過濾規則定為“*”就是一種錯誤,需要更正為“/*”或者其他(但是必須要有“/”開頭,表示當前項目),配置為:<url-pattern>/*</url-pattern> 。

該異常主要是你的web.xml中過濾的規則配置出錯了,與我上面的那個異常不同。

希望對各位有所幫助!



免責聲明!

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



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