項目總結之maven衝突
描述
今天遇見了一個相對而言有點奇葩的問題,一個pom文件的依賴配置,如果是以下配置的話:
image.png
則發布成功,一點問題都沒有,如果是以下配置的話:
則會拋出以下異常:
通過師兄的指點加上多方查證了解到是依賴衝突了,現在具體描述下查證的過程:
由以上的堆棧異常可以看出,在載入依賴的時候javax.servlet.ServletContext少了個getVirtualServerName()函數,於是我定位到tomcat-embed-core-8.5.14.jar這個依賴下
發現tomcat-embed-core-8.5.14.jar這個依賴下的ServletContext是有getVirtualServerName函數的,那麼為什麼這裡還提示找不到呢?我猜測是因為jar包衝突,在載入tomcat-embed-core-8.5.14.jar下的ServletContext之前就先載入了其他jar包的ServletContext了,於是查找了相關的依賴,在:
找到了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,就可以看到了。如:
由圖也可以看出,依賴路徑也確實一樣。
總結:遇見問題要大膽的去請教,通過系統反饋的異常深入的研究問題出在哪裡,而不只是解決了問題就好!
Note:發布的這些文章全都是自己邊學邊總結的,難免有紕漏,如果發現有不足的地方,希望可以指出來,一起學習咯,么么噠。開源愛好者,相信開源的力量必將改變世界:osc :https://git.oschina.net/xi_fan
※不花一分冤枉錢,這3款千元機性價比太殘暴!
※想要更好的雲基礎設施管理!你檢查IT工具集了嗎?
※個性風的蘋果手機殼,專屬於蘋果手機
※這次真的來了!一加5首次官方亮相!
※跨境電商賣家如何決定是否在某平台進行銷售
TAG:安卓網 |
※如何成為 Apache 項目的 committer
※Collective 項目揭幕
※繼Aquila之後,Facebook宣布砍掉另一個空中聯網無人機項目Tether
※springboot項目初始化
※Andromeda項目:Surface Phone或以另外形式亮相
※Consensus大會對QuarkChain的深度十問,為你帶來項目的最新進展
※項目簡說之block collider
※kindeditor項目集成
※為刺激VR/AR領域發展 Digital Catapult再次啟動Augmentor項目
※Exchange Union項目進展
※flask 項目中使用 bootstrapFileInput
※Mozilla期望Firefox Fission項目能瓦解Spectre漏洞攻擊
※Essentium、易生和Polymaker加入「Ultimaker材料聯盟項目」
※Kickstarter升級Hardware Studio:讓投資者知道眾籌項目發展進度
※Origin Protocol項目短評
※Viptela+Cisco首個項目落地聯想
※使用Jira software+Structure實現大規模跨團隊項目管理
※Python web開發:Flask的項目配置
※SpringBoot如何進行項目打包部署
※軟體定義網路項目OpenContrail改名為Tungsten Fabric