您的位置:首頁>正文

項目總結之maven衝突

描述

今天遇見了一個相對而言有點奇葩的問題, 一個pom檔的依賴配置, 如果是以下配置的話:

image.png

則發佈成功, 一點問題都沒有, 如果是以下配置的話:

image.png

則會拋出以下異常:

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext] at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252) [na:1.7.0_17] at java.util.concurrent.FutureTask.get(FutureTask.java:111) [na:1.7.0_17] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939) ~[tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872) [tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) [tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) [tomcat-embed-core-8.5.14.jar:8.5.14] at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) [na:1.7.0_17] at java.util.concurrent.FutureTask.run(FutureTask.java:166) [na:1.7.0_17] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_17] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_17] at java.lang.Thread.run(Thread.java:722) [na:1.7.0_17] 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) [tomcat-embed-core-8.5.14.jar:8.5.14] ... 7 common frames omitted Caused by: org.apache.catalina.LifecycleException: Failed to start component [Pipeline[StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5117) ~[tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.14.jar:8.5.14] ... 7 common frames omitted Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.authenticator.NonLoginAuthenticator[]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:182) ~[tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.14.jar:8.5.14] ... 9 common frames omitted Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerNameLjava/lang/String; at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1141) ~[tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.14.jar:8.5.14] ... 11 common frames omitted

通過師兄的指點加上多方查證瞭解到是依賴衝突了, 現在具體描述下查證的過程:

image.png

由以上的堆疊異常可以看出, 在載入依賴的時候javax.servlet.ServletContext少了個getVirtualServerName函數, 於是我定位到tomcat-embed-core-8.5.14.jar這個依賴下

image.png

發現tomcat-embed-core-8.5.14.jar這個依賴下的ServletContext是有getVirtualServerName函數的, 那麼為什麼這裡還提示找不到呢?我猜測是因為jar包衝突, 在載入tomcat-embed-core-8.5.14.jar下的ServletContext之前就先載入了其他jar包的ServletContext了, 於是查找了相關的依賴, 在:

image.png

找到了ServletContext介面, 確實是沒有getVirtualServerName這個函數, 跟我上面的預想基本一致。

那麼問題來了, 為什麼反過來就可以了?

於是我又去穀歌了, 得知以下兩個知識點:1、依賴路徑最短優先原則一個專案Demo依賴了兩個jar包, 其中A-B-C-X(1.0) , A-D-X(2.0)。 由於X(2.0)路徑最短, 所以專案使用的是X(2.0)。 2、pom檔中聲明順序優先如果A-B-X(1.0) , A-C-X(2.0) 這樣的路徑長度一樣怎麼辦呢?這樣的情況下, maven會根據pom檔聲明的順序載入, 如果先聲明瞭B, 後聲明了C, 那就最後的依賴就會是X(1.0)。

於是我總結到, 應該是依賴路徑長短一樣, 導致跟pom檔中聲明的順序有關。

相信很多人和我一樣, 在猶豫如何查找依賴路徑, 以下推薦一種:

使用Intellij idea, 想看看它的maven依賴圖, 打開的pom.xml檔,在pom檔內容上右鍵Diagrams–Show Dependencies, 就可以看到了。 如:

image.png

由圖也可以看出, 依賴路徑也確實一樣。

總結:遇見問題要大膽的去請教, 通過系統回饋的異常深入的研究問題出在哪裡, 而不只是解決了問題就好!

Note:發佈的這些文章全都是自己邊學邊總結的, 難免有紕漏, 如果發現有不足的地方, 希望可以指出來, 一起學習咯, 麼麼噠。 開源愛好者, 相信開源的力量必將改變世界: osc :https://git.oschina.net/xi_fan

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示