Tomcat運行啓動異常:A child container failed during start java.util.concurrent.ExecutionException

JDK1.8+Tomcat8.0 +Eclipse+SSM+Maven

啓動Tomcat站點,有異常(無論是“重啓eclipse”還是重啓“電腦”,異常沒有解決):

嚴重: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/NestedManagent]]
 at java.util.concurrent.FutureTask.report(FutureTask.java:122)
 at java.util.concurrent.FutureTask.get(FutureTask.java:192)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/NestedManagent]]
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
 ... 6 more
Caused by: java.lang.NoClassDefFoundError: org/springframework/web/context/request/async/CallableProcessingInterceptor
 at java.lang.Class.getDeclaredFields0(Native Method)
 at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
 at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:256)
 at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:132)
 at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:65)
 at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig............

問題出現之後,我先是查看“端口8080”是否被進程佔用,沒有!!!

接着我去啓動關閉Tomcat8試試,

Stop的按鈕就會亮起,緊接着我點擊Stop按鈕;然後,我去重啓eclipse的站點,還是報錯,但是,我去查看端口8080佔用情況,發現8080端口被“0端口”進程佔用了,並且顯示“TIME_WAIT”狀態,

百度:TCP 連接的 TIME_WAIT 過多 導致 Tomcat 假死

(我順便查看了有多少進程處於TIME_WAIT狀態【在MySQL 調優基礎(五) Linux網絡中拷貝的命令】:

 

補充:端口8080正常被佔用時,可以終止進程:(狀態是 ESTABLISHED 已設定的、已建立的、被安排好的)

我百度了一下,我覺得(在Win7系統)答案並不是那樣的:

MySQL 調優基礎(五) Linux網絡

然後我拋開“Time_Wait”的問題,根據“控制檯彈出的異常”來查找答案:

發現:

啓動tomcat時報錯:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException:A child container failed during start

我符合文章的第二種情況:

我的第一解決方案:

檢查自己的“Dynamic Web Module”版本,一般是:3.0的Dynamic Web Module、1.8的jdk、8.0或8.5的Tomcat;

從圖可知,我的Dynamic Web Module是2.3版本,與上圖版本不一致,而jdk爲1.8版本,搭配有問題【其實創建項目或者導入項目,都要檢查版本的,eclipse有時莫名其妙,這次就是把我的Dynamic Web Module恢復eclipse的默認版本號2.3,選項最低爲2.2版本號】,則Dynamic Web Module改成3.0,你若直接選擇3.0,apply控件會變灰色,且有個框彈出並提示“Cannot change version of project facet Dynamic Web Module to 3.0”【橢圓框內,表示Dynamic Web Module3.0版本搭配1.6以上版本的jdk】

 改:(你找不到文件,可以使用‘文件管理器’的搜索框直接搜索,選擇對應項目的‘.setting’文件夾下的兩個org.eclipse.jdt.core.prefs.prefs、org.eclipse.wst.common.project.facet.core文件)

找到工作空間中的項目,打開項目找到.settings文件夾打開,編輯兩個文件:

1.org.eclipse.jdt.core.prefs.prefs文件中的:

eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.8

將1.8修改成對應的jdk版本

 

2.org.eclipse.wst.common.project.facet.core.xml文件中:

<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<runtime name="Apache Tomcat v8.5"/>
<fixed facet="wst.jsdt.web"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.8"/>
<installed facet="jst.web" version="3.0"/>
</faceted-project>

將這個<installed facet="java" version="1.8"/>改成對應的java版本號,<installed facet="jst.web" version="3.1"/>改成對應的Dynamic Web module的版本號。

然後再打開project facet 查看是否修改。

改了之後,重啓eclipse,運行站點,成功,但是我接下來沒有用eclipse或者訪問站點,隔個十幾分鍾,我訪問相應頁面,404!!!奇怪,成功運行了站點,怎麼404,(非常肯定不是我的頁面有問題,不是我的Controller訪問方式有問題),接着我重新運行Tomcat站點,報錯,重複‘一開始報的錯’,然後我查看端口8080,又是Time_Wait狀態!!!

【可能別人改完版本號,就完完全全好了,反正我的這個,No~】

第二解決方案:

上面那麼解決方案,對我的問題,似乎是“治標不治本”,然後看了個論壇,很簡單的回覆,反正根據提問者的答案,我解決了!!!

tomcat啓動錯誤 A child container failed during start :

確實“簡單暴力,直接了當”!!!我右擊Tomcat,選擇delete,然後點擊servers窗口裏的帶下劃線的鏈接,new一個Tomcat——》Next或者直接Finish———》(我選擇Next)在左邊框裏,選擇對應項目——》add添加至右邊的框裏——》Finish——》根據你個人情況,選擇調試還是直接運行,我個人喜歡選擇調試,因爲斷點可以設置跳過【】!!!

 

 

補充:

(若選擇Finish,選擇Tomcat server右擊——》選擇Add and Remove 即可添加項目) 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章