一、背景
項目新拉了一個分支開發,前幾天好好的,加了一些功能後發現部署一直失敗。
總是報同一個錯誤(詳見2.1),而且并不像是自己代碼的錯誤。
和同僚花費了一些時間進行排查,最終定位并解決問題,記下分析思路。
二、排查步驟
注:截圖均來自自己的本地練習項目,而不是排查一模一樣的截圖,隻是示範效果。
2.1報錯内容
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:941)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1421)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1411)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
... 6 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Failed to start component [Pipeline[StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5166)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.authenticator.NonLoginAuthenticator[]]
at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:182)
... 8 common frames omitted
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1186)
... 10 common frames omitted
2019-05-28 11:30:28.605 WARN 25 --- [main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
2019-05-28 11:30:28.640 ERROR 25 --- [main] o.s.boot.SpringApplication : Application startup failed
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
2.2 嘗試
第一反應是給出的錯誤資訊非常不明确,就是說tomcat啟動失敗。
(1) 由于這個項目是一個maven項目,直接用maven編譯指令檢視是否可以編譯成功,發現都SUCCESS.
(2) 嘗試把代碼釋出到不同的環境,檢視是否是環境造成的,釋出到了其他環境上,偶爾能成功,釋出master都成功,排除了環境bug。
(3) 在google上搜報錯資訊,大多數提示是servlet-api的jar包沖突。
然後使用mvn dependency:tree 檢視依賴樹,發現新引入的幾個jar包其中有一部分确實包含了servlet-api。
然修改pom.xml檔案,排除servelt-api相關依賴。
發現依舊報錯。
(4) 由于新增了多個jar包不确定是哪個jar包引起的,是以基于這個分支新拉出一個分支用于删除依賴排錯。
删除最可以的新的jar包以及相關的本地代碼,重新部署,釋出成功。
然後定位到此jar包的servlet-api是通過jboss的包引入的。
由于這是第二方的dubbo的調用api jar包,是以可以放心去掉jboss。
直接排除了jboss的依賴。
————————————————
版權聲明:本文為CSDN部落客「明明如月學長」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:
https://blog.csdn.net/w605283073/article/details/90648055