精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

程序員需要了解依賴沖突的原因以及解決辦法

開發
依賴沖突是日常開發中經常碰到的過程,如果運氣好,并不會有什么問題。偏偏阿粉有點背,碰到好幾次生產問題,排查一整晚,最后發現卻是依賴沖突的引起的問題。

前言

依賴沖突是日常開發中經常碰到的過程,如果運氣好,并不會有什么問題。偏偏阿粉有點背,碰到好幾次生產問題,排查一整晚,最后發現卻是依賴沖突的引起的問題。

沒碰到過這個問題同學可能沒什么感覺,阿粉舉兩個最近碰到例子,讓大家感受一些。

例子 1:

我們公司有個古老的業務基礎包 A。B,C 業務依賴這個包。某個團隊拷貝 A 的部分代碼進行重構,類名與路徑完全一樣,然后重新打包成 D 發布。

一次業務改動,B 業務也引入了 D 包,測試環境運行的時候,一切 OK,但是在生產運行時,卻拋出 NoSuchMethodError。

問題原因在于 B 業務依賴 A,D。而 A,D 存在兩個同包同名類,運行的時候,具體加載誰,不同環境還真不一樣。

例子 2:

A 業務使用 Dubbo 進行 RPC調用, Dubbo 需要依賴 javassist。當前依賴關系為: 

  1. A------->Dubbo------->javassist-3.18.1.GA 

某次改動中引入另外一個第三方開源包,其依賴 javassist-3.15.0-GA 。生產發布的時候,將 javassist-3.15.0-GA 打包到應用中,由于生產環節為 JDK1.8,從而導致運行直接失敗。

除了上述問題,依賴沖突還可能導致應用拋出 ClassNotFoundException,NoClassDefFoundError 等錯誤。

拋出錯誤這種情況還算好,還比較容易定位問題。怕就怕,不同版本同一個類內部邏輯不同,從而導致業務異常。這種問題,真的很讓人抓狂,讓人頭禿。 

[[315774]] 

仔細分析依賴沖突,主要可以分為兩類:

  • 項目同一依賴應用,存在多版本,每個版本同一個類,可能存在差異。
  • 項目不同依賴應用,存在包名,類名完全一樣的類。

下面我們分析一下依賴沖突產生的原因。

1 依賴沖突產生原因

1.1 依賴機制

Maven 依賴分為兩種情況,直接依賴與間接依賴,這個比較好理解,大家直接看圖就好。 

 

1.2 仲裁機制

如果 A 應用間接依賴多個 C 應用,且版本都不一樣,Maven 將會通過仲裁機制選擇:

  • 優先按照依賴管理元素中指定的版本聲明進行仲裁時,下面的兩個原則都無效了
  • 短路徑優先
  • 若路徑相同,將看 pom 中聲明的順序。

第一條原則,我們下面再說。

第二條原則,如下圖: 

A 間接依賴兩個版本 E,這種情況下,由于 A 到 E-1.0 路徑最短,所以 A 中將會使用 E-1.0。

如果路徑恰好一樣,那么這種情況下 Maven 只能根據 pom 中的順序,選擇最先聲明的,這也是個無奈的選擇。

1.3 scope 屬性

Maven 項目可以分為三個階段:編譯階段,測試階段,運行階段了。通過 scope 屬性,我們可以決定依賴應用是否參與以上階段,也將會影響依賴傳遞。

Maven 提供 6 種 scope :

  • compile
  • provided
  • runtime
  • test
  • system
  • import

compile

compile 是 Maven 默認屬性,將會使依賴包參與項目的編譯,測試,運行階段。當然,項目打包之后將會包含該依賴。

provided

provided 意味著依賴僅參與項目編譯,測試的階段。若有如下依賴關系:

A----->B----->C

C 的 scope 為provided,C 將會參與 B 的編譯,測試階段,但是 C 不會傳遞給 A。如果 A 運行過程需要 C,需要自己直接引入 C 依賴。典型如 Servlet API,因為 Tomcat 等容器內部會提供。

runtime

runtime 代表依賴不再參與項目編譯階段,只參與測試,運行階段。

若依賴不參與編譯階段,這種情況 IDE 中是無法導入相應的類的。若存在依賴類,編譯過程中將會報錯。

典型的例子是 JDBC 驅動包,如 mysql :

  1. <dependency> 
  2.     <groupId>mysql</groupId> 
  3.     <artifactId>mysql-connector-java</artifactId> 
  4.     <version>6.0.6</version> 
  5.     <scope>runtime</scope> 
  6. </dependency> 

知識點:這個好處在于,只能使用 JDBC 標準接口,這樣就不會與特定的數據庫綁定。后續若切換數據庫,只需要更換 pom,然后修改相應的參數即可。

test

test 僅參與測試階段的工作,典型的例子為 junit:

  1. <dependency> 
  2.     <groupId>junit</groupId> 
  3.     <artifactId>junit</artifactId> 
  4.     <version>4.12</version> 
  5.     <scope>test</scope> 
  6. </dependency> 

system

system 與 provided 范圍一致,只不過 system 需要使用 systemPath 屬性指定本地路徑,而 provided 將會從 Maven 倉庫拉取。

import

import 比較特殊,不會參與以上階段運行。其只能在 dependencyManagement下使用,且 type需要為 pom。典型的例子為 Spring-boot 依賴。

  1. <dependencyManagement> 
  2.     <dependencies> 
  3.         <!-- Spring Boot --> 
  4.         <dependency> 
  5.             <groupId>org.springframework.boot</groupId> 
  6.             <artifactId>spring-boot-dependencies</artifactId> 
  7.             <version>2.1.6.RELEASE</version> 
  8.             <type>pom</type> 
  9.             <scope>import</scope> 
  10.         </dependency> 
  11.     </dependencies> 
  12. </dependencyManagement> 

知識點:通過這種方式,解決單繼承問題,也可以更好將依賴分類。

另外 Maven scope 將會影響依賴傳遞。 

如果依賴關系為: A--->B--->C,A 依賴 B,B 依賴 C。最左列代表 B 的 scope 屬性,第一行代表 C 的 scope 屬性

如上所示,當 C 的 scope 為 provided/test, C 只在 B 中起作用,不會通過間接依賴傳遞給 A。

當且僅當 B 的 scope 為 compile,且 C scope 為 runtime ,A 將會間接依賴 C,且 scope 為 runtime。其他情況下,C 的 scope 將會與 B 的 scope 一致。

2. 解決沖突的方法

2.1 使用 Maven 屬性控制依賴傳遞

依賴沖突時,根據錯誤日志,定位到沖突類,定位相應 jar 包,最后通過 excludes 排除相應的包。

另外可以結合 IDEA Maven Helper 插件,主動檢查沖突依賴,提前排除。 

 

通過插件,我們可以清晰看到沖突包,以及依賴路徑,還有相應的 Scope。

除了排除依賴,我們可以通過合理的設置 scope 屬性,不讓依賴傳播下去。比如說,A 需要是使用 Spring-beans 包中某些類。如果其他項目鐵定會使用 Spring,那么我們可以將 A 中 Spring-beansscope 設置為 provided,讓其他項目自己選擇引入 Spring-beans 的版本。

這個適合公共基礎包,其他包不要隨便使用provided,若使用一定要寫清楚,使用過程中需要引入的依賴。

以上方法雖然治標,但是不治本。如果想依賴沖突不發生,我們需要提前建立一定的規范,團隊一起遵守,才能有效避免該類問題。

  1. 應用項目中使用 dependencyManagement統一管理基礎依賴,定義統一的版本,如常用中間包,工具包,日志包。
  2. 二方包中不要引入無關的依賴,做到盡量少的依賴。團隊開發中,比較常見情況是二方包繼承公共的父 pom,從而導致繼承許多無相關的依賴,這種情況可以單獨管理。
  3. 二方包做好向下兼容,不要隨意改動現有類名,方法名,字段名。
  4. 項目應用上線之前,將 snapshot 替換成正式版本。雖然 snapshot 修改起來很方便,但是正因為這個特性,可以被隨便修改。如果某次生產打包發布不注意,就會引入。
  5. 二方包不要使用同一個包名,類名。一般來說,團隊開發中,包名,類名一樣概率比較小。這種比較容易出現在一些重構項目,復制原來類,重構打包發布。對于情況下可以修改包名。如 cmomon-lang3 是 common-lang 升級版, cmomon-lang3包名為 org.apache.commons.lang3,而 common-lang 包名為 org.apache.commons.lang

3. 總結

如果我們把 NPE 問題當做新手村普通怪物,那么依賴沖突問題就是人馬這種精英怪。剛開始遇到,我們會被虐的比較慘。只有我們不斷升級,學習掌握技巧,然后才能可以從容不迫解決。

ps:塞爾達中,你們第一次遇見人馬,打了幾次?阿粉記得那天整整從晚上九點打到凌晨兩點,就是打不過啊~ 

 

4. 幫助文檔

Maven Dependency Scopes

Maven optional關鍵字透徹圖解

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2015-10-15 09:38:21

程序員發福

2024-12-13 08:02:55

大模型GPT后端

2019-02-21 10:51:37

程序員技能溝通

2021-05-05 11:32:36

MySQL數據庫索引

2010-05-04 13:52:00

Oracle用戶被鎖

2022-01-05 08:00:00

框架Golang開源

2019-11-19 15:10:40

程序員操作系統計算機基礎

2015-10-29 10:26:45

Windows管理員技巧Linux

2015-03-09 15:41:08

MongoDB查詢超時異常Socket Time

2009-07-31 09:14:01

WinCE啟動失敗

2017-06-21 08:30:20

MySQL原因解決辦法

2011-04-01 11:16:06

hessian

2012-06-26 10:13:55

2024-06-14 16:07:41

2012-06-27 09:11:47

2020-12-09 09:30:57

前端開發技術

2009-11-30 10:09:31

PHP中文亂碼

2023-06-20 11:46:58

2020-11-25 08:23:51

SaaSIaaS網絡管理

2024-01-04 09:04:02

點贊
收藏

51CTO技術棧公眾號

丁香婷婷综合激情五月色| 国产精品二区不卡| 天天亚洲美女在线视频| 麻豆传媒一区| 91tv国产成人福利| 国产精品mm| 亚洲三级av在线| 三级黄色片免费看| 欧美办公室脚交xxxx| 欧美国产精品劲爆| 国产伦视频一区二区三区| 五月婷婷六月婷婷| 欧美日韩综合| 亚洲性夜色噜噜噜7777| 18深夜在线观看免费视频| 鲁鲁在线中文| 亚洲欧美日韩中文字幕一区二区三区| 国产伦精品一区二区三区免费视频| 无码人妻一区二区三区线| 久久久久久久久久久妇女| 日韩精品视频在线| 久久精品视频在线观看免费| 97se综合| 亚洲福利电影网| 亚洲欧美日韩综合一区| 四虎精品在永久在线观看| 精品在线免费观看| 国产成人精品视频在线观看| 久久久精品视频在线| 日韩av久操| 日韩国产精品一区| 韩国三级在线看| 欧美另类激情| 91福利国产成人精品照片| 国产欧美精品aaaaaa片| 麻豆视频网站在线观看| 久久久久国产精品人| 国产精品对白刺激久久久| 国产免费不卡av| 日本欧美在线观看| 国产精品国产三级国产aⅴ浪潮| 国产h视频在线播放| a毛片在线看免费观看| 欧美激情一区在线观看| 欧美高清视频一区二区三区在线观看| 亚洲成人黄色片| 国产一区不卡视频| 成人激情视频小说免费下载| 中文字幕乱码人妻二区三区| 美女精品在线观看| 日韩美女在线观看一区| √资源天堂中文在线| 久久电影一区| 欧美一区二区影院| 亚洲欧美一区二区三区在线观看| 国产精品丝袜xxxxxxx| 97人人爽人人喊人人模波多| 日韩免费不卡视频| 亚洲精品日韩久久| 欧美二区在线播放| 久久久久亚洲av无码专区体验| 91av精品| 欧美夫妻性视频| 麻豆一区二区三区精品视频| 黄色欧美日韩| 91国产一区在线| 91在线视频在线观看| 久久国产日韩| 国产精品免费一区二区三区都可以 | 亚洲а∨天堂久久精品喷水 | 成人日韩视频| 日韩你懂的在线播放| 国产精品亚洲一区二区无码| 免费萌白酱国产一区二区三区| 亚洲国产精品网站| 欧美亚洲精品一区二区| 亚洲人成在线网站| 91官网在线观看| 五月天av在线播放| 欧美黄色一级| 日韩精品中文字幕在线播放| 中文字幕免费视频| 国产精品福利在线观看播放| 欧美激情二区三区| 国产区一区二区三| 美女在线视频一区| 超碰97在线播放| 香港三日本三级少妇66| 国产欧美精品一区二区色综合 | 91精品免费久久久久久久久| 一级黄色大片网站| 国产东北露脸精品视频| 国产自产在线视频一区| 高清在线观看av| 亚洲精品久久久蜜桃| 岛国大片在线播放| 香蕉成人av| 欧美丰满高潮xxxx喷水动漫| 久久人妻少妇嫩草av无码专区| 精品国产乱码久久久| 九九久久久久99精品| 四虎成人永久免费视频| 国产乱码精品一区二区三区av | 国内精品久久久久久99蜜桃| 久久精品国产一区二区电影| 日韩av片在线播放| 久久er99热精品一区二区| 精品国产aⅴ麻豆| 香蕉视频在线播放| 精品动漫一区二区| 黑人巨大猛交丰满少妇| 亚洲区小说区图片区qvod| 久久婷婷国产麻豆91天堂| 一级成人黄色片| 国产成人精品影视| 亚洲成色最大综合在线| 在线免费看h| 日韩欧美色综合网站| 国产精品久久久久久久av| 国内视频精品| 亚洲iv一区二区三区| 国产福利在线看| 天天综合网天天综合色| xxxxwww一片| 国产精品久久久久无码av| 国产成人小视频在线观看| 天天干天天干天天干| 亚洲精品日日夜夜| 日韩欧美亚洲另类| 成人免费av| 欧美一级视频免费在线观看| 黄色成人一级片| 亚洲欧美一区二区三区国产精品| 校园春色 亚洲色图| 久久99国内| 69精品小视频| 日本黄色三级视频| 亚洲国产精品久久久久秋霞影院 | 日韩网址在线观看| 国产乱论精品| 久久久噜噜噜久久中文字免| 国产高清在线免费| 亚洲精品五月天| 911av视频| 99久久激情| 国产精品视频一| а√天堂中文在线资源bt在线| 色婷婷综合五月| 熟女少妇一区二区三区| 亚洲免费综合| 欧美日韩国产综合视频在线| 在线黄色的网站| 亚洲欧美中文字幕| 欧美brazzers| 国产精品麻豆欧美日韩ww| 热久久精品免费视频| re久久精品视频| 国产精品极品尤物在线观看| 国产一二三区在线视频| 欧美视频在线观看一区| 国产破处视频在线观看| 免费高清视频精品| 视频一区二区视频| 欧美精品三级在线| 国产综合在线视频| 亚洲色图 校园春色| 疯狂做受xxxx高潮欧美日本| av在线网站观看| 日韩高清不卡在线| 亚洲精品成人a8198a| 国产精品美女久久久久| 欧美激情小视频| 污视频网站免费观看| 91久久精品午夜一区二区| 国产精品一区二区亚洲| 国产真实精品久久二三区| 17c丨国产丨精品视频| 欧洲在线一区| 国产精品丝袜白浆摸在线| 国产福利在线播放麻豆| 欧美精品一区二区三区蜜桃| 在线观看精品国产| 中文一区一区三区高中清不卡| www.cao超碰| 亚洲美女色禁图| 亚洲激情图片| 加勒比色综合久久久久久久久| 亚洲精品久久久久中文字幕欢迎你| 亚洲免费在线观看av| 国产拍揄自揄精品视频麻豆| 亚洲自拍第三页| 亚洲国产免费看| 亚洲一区二区三区免费看| 涩爱av色老久久精品偷偷鲁 | 久久精品xxxxx| 色综合久久88色综合天天看泰| 天堂中文在线视频| 欧美一区二区三区在线电影| 五月天激情国产综合婷婷婷| 中文字幕一区二区不卡| 中文字幕在线免费看线人| 久久69国产一区二区蜜臀| 免费拍拍拍网站| 羞羞答答成人影院www| 开心色怡人综合网站| 精品国产亚洲一区二区三区大结局| 91国内在线视频| 国产素人视频在线观看| 亚洲天堂开心观看| 东京干手机福利视频| 欧美色手机在线观看| 成年人午夜视频| 亚洲久草在线视频| avhd101老司机| 91老司机福利 在线| 国产人妻精品午夜福利免费| 久久国产精品72免费观看| 无码人妻丰满熟妇区96| 欧美日韩国产色综合一二三四| 日韩欧美精品久久| 欧美偷窥清纯综合图区| 成人免费视频网站| 成人在线啊v| 国产欧美日韩视频| 三级成人在线| 国产ts一区二区| 国产盗摄——sm在线视频| 久国内精品在线| 黄网页在线观看| 中文字幕亚洲天堂| 国产精品ⅴa有声小说| 国产视频丨精品|在线观看| 亚洲成人黄色片| 日韩欧美卡一卡二| a天堂在线观看视频| 欧美高清视频www夜色资源网| 一级片在线免费播放| 色综合久久综合网97色综合| 国产黄色片免费看| 性久久久久久久久久久久| 国产亚洲欧美久久久久| 亚洲精品国产一区二区精华液 | 毛片免费不卡| 综合久久五月天| www黄在线观看| 国产一区二区黑人欧美xxxx| 国产系列在线观看| 亚洲网站在线看| 高清av在线| 色黄久久久久久| 免费高清在线观看| 久久韩国免费视频| 91亚洲天堂| 欧美日韩国产成人高清视频| 丰乳肥臀在线| 91成人天堂久久成人| 婷婷综合六月| 国产日本欧美一区| 亚洲精品aⅴ| 国语精品中文字幕| 九九视频免费观看视频精品| 日本在线视频不卡| 欧美电影一二区| a级网站在线观看| 亚洲午夜电影| 男人揉女人奶房视频60分| 日本视频一区二区三区| 最新免费av网址| 成人夜色视频网站在线观看| 你懂得在线视频| 国产欧美日韩三区| 亚洲国产精品免费在线观看| 亚洲福利国产精品| 免费黄色小视频在线观看| 在线播放中文字幕一区| 国产自产一区二区| 亚洲四色影视在线观看| 国产乱色在线观看| 欧美一区深夜视频| 日日夜夜亚洲| 国产一区二区黄色| 久久精品播放| www.av毛片| 蜜臀av一区二区在线免费观看| 日本亚洲一区二区三区| 久久色在线视频| 老司机成人免费视频| 成人精品小蝌蚪| 国精产品一区二区三区| 亚洲四区在线观看| 久久久久女人精品毛片九一| 欧美精品乱码久久久久久按摩| 天堂在线视频观看| 最新国产精品亚洲| 中文字幕高清在线播放| 91九色在线免费视频| 久操国产精品| 18禁裸男晨勃露j毛免费观看| 日韩影院在线观看| www.四虎精品| 国产精品免费人成网站| 日韩少妇裸体做爰视频| 欧美精品电影在线播放| 日漫免费在线观看网站| 久久成人精品视频| 四虎影视4hu4虎成人| 国产精品三区在线| 香蕉国产精品| 黄色av免费在线播放| 成人动漫精品一区二区| 大地资源高清在线视频观看| 一本到不卡精品视频在线观看| www.com欧美| 日韩综合视频在线观看| 暖暖成人免费视频| 国产日韩一区欧美| 午夜性色一区二区三区免费视频| 99热这里只有精品在线播放| 91偷拍与自偷拍精品| 国产一卡二卡在线播放| 7777精品伊人久久久大香线蕉最新版| 免费在线观看污视频| 97视频com| 成人在线tv视频| 成年丰满熟妇午夜免费视频 | 国产日韩视频一区| 亚洲欧美日韩人成在线播放| 糖心vlog精品一区二区| 亚洲欧美日韩另类| 高清精品在线| 国产精品美女黄网| 韩日成人在线| 日本美女久久久| 亚洲男人的天堂在线aⅴ视频| 这里只有精品6| 中文字幕av日韩| www成人在线视频| 日韩不卡av| 久久这里只有| 久久久久久久久久久久| 日本乱码高清不卡字幕| 免费在线稳定资源站| 日韩av电影在线播放| 久久91麻豆精品一区| 男人天堂成人在线| 国产无一区二区| 亚洲天堂男人av| 亚洲欧美在线x视频| 欧美大电影免费观看| 蜜桃av久久久亚洲精品| 久久久久国产一区二区| 久久久久久久久久久久久久久| 色婷婷综合久久久久中文| 国产精品一区二区婷婷| 国产精品免费久久久久久| 久久国产成人午夜av影院宅| 色综合天天色综合| 亚洲欧洲成人精品av97| 国产婷婷在线视频| 欧美精品久久久久久久久| 久久影院资源站| 日本在线观看a| 国产精品免费看片| 国产视频一区二区三区四区五区 | 中文字幕在线看片| 日本黑人久久| 久久成人精品无人区| 国产精品白丝喷水在线观看| 日韩女优电影在线观看| 日本黄色免费在线| 日韩欧美亚洲日产国| 精品无人区卡一卡二卡三乱码免费卡 | 国内成人精品一区| 日韩高清一级| www.这里只有精品| 一区二区三区在线不卡| 五月婷婷综合久久| 国产精品久久久久久久久久久久久 | 亚洲经典中文字幕| 久久久成人av毛片免费观看| 自拍偷拍亚洲色图欧美| 成人精品在线视频观看| 天堂网视频在线| www.国产精品一二区| 国产香蕉精品| 高潮一区二区三区| 亚洲成人www| 国产精品久久久久一区二区国产 | 欧美在线性爱视频| 久久久久久久久久久久久久| 国产黑丝在线观看| 欧美日韩黄色一区二区| 国产www视频在线观看| 神马影院我不卡| 国产aⅴ综合色| 中文字幕黄色av| 午夜精品久久久久久久99黑人| 沈樵精品国产成av片| 亚洲成人精品在线播放| 91福利小视频|