原文鏈接: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中過濾的規則配置出錯了,與我上面的那個異常不同。
希望對各位有所幫助!