天天看點

記一次maven jar包沖突的排查和解決過程,幹貨分享

一、背景

項目新拉了一個分支開發,前幾天好好的,加了一些功能後發現部署一直失敗。

總是報同一個錯誤(詳見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