tomcat7時遇到啟動報錯問題 SEVERE: ContainerBase.addChild: start:


個人說明:錯誤日志確實是我的,方法都是從其他地兒借鑒過來的,但肯定是能解決錯誤的方法,親身體驗,安全保障!!!

還有遇到這種問題,多啟動幾遍可能就行了。

 

錯誤日志:

SEVERE: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/datasvc]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:154)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1245)
        at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1895)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/datasvc] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]
        at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2126)
        at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2072)
        at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1947)
        at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1913)
        at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1898)
        at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1330)
        at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:889)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:386)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5380)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 11 more

分析:

使用tomcat 7.0.3x版本的同學可以發現tomcat啟動慢了不少,而且還可能遇到如下啟動時異常:

Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.

tomcat7.0.3X版本支持servlet3.0的特性,比如說支持@WebServlet、@WebListener,要支持這些特 性,tomcat就得去掃描所有的jar包里面的每個類。這個異常表明在掃描jar包的時候,遞歸調用太深,導致棧溢出了,tomcat給了一個餿主意, 讓你增大xss,這個還是不好,xss加大了,可用線程數就少了。

分析tomcat源代碼,發現它掃描的流程如下:

1.掃描所有jar包

2.通過查找jar包中META-INF/services/javax.servlet.ServletContainerInitializer文件內的定義,初始化ServletContainerInitializer實現

3.如果web.xml中配置了metadata-complete="true" 或者沒有找到ServletContainerInitializer實現,都不會繼續掃描jar包

網上大多數的答案的都是說在web.xml中加入了metadata-complete="true"就能避免這個異常。確實在很多場景下,這個 異常是能夠避免。但是使用spring-web-3.1.0.RELEASE的同學就杯具了,這個jar包中定義了一個 ServletContainerInitializer,還是導致了掃描jar包。

我們可以用另外的辦法來解決這個問題,我們讓tomcat不掃描指定的jar包,tomcat就要輕松得多 了,org.apache.tomcat.util.scan.StandardJarScanner中定義了defaultJarsToSkip,有了 這個東東,我們就可以跳過某些jar包。


*******解決辦法:     如果你不想使用servlet3.0 annotation支持,在tomcat的catalina.properties配置文件中 tomcat.util.scan.DefaultJarScanner.jarsToSkip的值后面加一個",*",這樣就不會掃描所有的jar包 了。啟動更快,也不會出異常。


tomcat在處理掃描是還有個小bug,比如我遇到了

SEVERE: Unable to process Jar entry [__MACOSX/cn/****/._HandlerFactory.class] from...

這是tomcat在掃描到以.class為后綴的文件后,就分析類,很明顯,此文件都不是java類文件。tomcat不應該只判斷后綴為.class就是java類文件。


免責聲明!

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



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