日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

好机会,我要帮女同事解决Maven冲突问题

發布時間:2025/3/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 好机会,我要帮女同事解决Maven冲突问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

任何一個故事起因最重要

任何一個職業,女生都有絕對的優勢。更別提 IT 行業了,在部門中要是有女程序猿那肯定是香餑餑,備受呵護呀。

之前有一次,一位剛來的妹子遇到問題了,畫風頓時就變成上面的圖片了,群起而圍之,但是最后的結果并不理想,還是得我出馬(此處有點小吹牛)。

妹子遇到的是 Jar 包沖突的問題,錯誤信息是 Caused by: java.lang.ClassNotFoundException,看錯誤要么就是缺少某個 Jar 包,要么就是沖突了。

其實在工作中經常會遇到這種沖突的問題,比如:Caused by:java.lang.NoSuchMethodError 這個異常信息也是沖突導致的,想要解決沖突問題就必須得知道哪里沖突了(好像是廢話)。

大部分都是用 Maven 來管理依賴的 Jar,今天這篇文章主要是講解如何解決 Maven 帶來的依賴沖突問題。


Maven 自述

Maven 是用于構建和管理 Java 項目的工具。對于 Java 方向的來說,Maven 幾乎都要接觸和使用。當然也有其他的工具來代替 Maven,比如 Ant 和 Gradle。

之前有接觸過 Grails 構建的 Java Web 項目,就是用 Gradle 來做依賴管理的。至于 Ant 也在剛工作的時候在一些老項目中有見到過,后面幾乎沒見過了。

Maven 文檔地址:https://maven.apache.org[1]

使用 Maven 可以讓我們快速構建一個新的項目,并且很方便的可以集成和管理多個三方的框架。當我們需要某個框架時可以去搜索一下這個框架的信息,然后配置到你的項目中即可。

搜索地址:https://mvnrepository.com[2]

比如我們想要使用 Spring Boot,除了在 Spring 的文檔中獲取依賴的版本,也可以自己去搜索,選擇對應的版本,如下圖:

可以看到默認就是 Maven 的依賴方式,只需要將 dependency 整段內容復制到項目的 pom.xml 文件中即可。右側還有很多其他的依賴方式,比如 Gradle 等。


Maven 依賴傳遞

今天主要講下如何去解決 Maven 做依賴管理的時候 Jar 包沖突的問題,在解決之前先來了解下基本的知識。

上圖展示了 Maven 的依賴傳遞性,首先是項目 B 中依賴了 Spring 和 Guava 兩個框架。然后項目 A 又依賴了項目 B,所以項目 A 也會依賴 Spring 和 Guava 兩個框架。


依賴傳遞 Jar 包選擇邏輯

依賴性傳遞會導致項目中依賴很多其他版本的 Jar,這種情況下怎么進行 Jar 包的選擇呢?

有兩個規則:

  • 不同距離,距離近優先

  • 相同距離,前者優先

如下圖所示,項目依賴了項目 A 和項目 B,A 和 B 分別依賴了 Guava,但是從依賴層次來看,項目 B 的層次更淺,故 Guava18.0 會被優先選擇。

當距離相同的時候,就會優先選擇定義在前面的,如下圖所示,項目 A 和項目 B 都分別依賴了 Guava15.0 和 Guava18.0 的版本,但是項目 A 的順序在項目 B 的前面,所以會優先選擇 Guava15.0 版本。

通過依賴傳遞性經常會導致 Jar 包沖突的問題,比如下圖的項目 A 本身依賴了 Guava15.0,然后又依賴了項目 B,項目 B 中依賴了 Guava18.0,這樣項目 A 就會同時依賴 Guava15.0 和 Guava18.0。

如果剛好用到了高版本不兼容低版本的方法和類時,就會出現選擇錯誤,因為 Maven 會根據依賴樹的深淺來選型淺的依賴,也就是 15.0。


沖突案例

下面就是一個典型的 Jar 包沖突問題,當一個 Jar 有多個版本的時候,就會出現沖突。

錯誤信息可以看到 com.google.common.collect.FluentIterable.concat 這個方法找不到,目前是從 guava-18.0.jar 中加載的,這種問題我們改怎么解決呢?

Description: An attempt was made to call the method com.google.common.collect.FluentIterable.concat(Ljava/lang/Iterable;Ljava/lang/Iterable;)Lcom/google/common/collect/FluentIterable; but it does not exist. Its class, com.google.common.collect.FluentIterable, is available from the following locations:jar:file:/Users/yinjihuan/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jar!/com/google/common/collect/FluentIterable.class It was loaded from the following location:file:/Users/yinjihuan/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jarAction: Correct the classpath of your application so that it contains a single, compatible version of com.google.common.collect.FluentIterable


解決思路之懸絲診脈

找出沖突的 Jar,看看當前項目中依賴了哪幾個版本。

??

Eclipse

在 Eclipse 中可以雙擊 pom 文件,進入 Dependency 視圖,輸入你要搜索的 jar 名稱進行搜索,就可以看出當前項目中哪些框架依賴了你搜索的 jar,什么版本都能知道。

Idea

Idea 中可以安裝 maven helper 插件來查看相關依賴信息,默認選中 Conflicts 會展示當前項目存在沖突的依賴,當然我們也可以直接查看樹形的依賴關系去分析沖突。


Maven 命令

不用不借助于開發工具的插件,我們可以直接用 Maven 命令來查看當前項目的依賴關系,命令行進入到你要分析的項目目錄下,執行下面的命令將分析結果保存到文件中:

mvn dependency:tree > tree.log

執行完之后依賴的信息結構如下:

搜索了下 guava,發現在 smjdbctemplate 中依賴了 18.0 版本,這個框架是我自己基于 jdbctemplate 封裝的一個框架。


解決思路之察言觀色

其實很明顯,錯誤信息已經告訴我們 18.0 中找不到 concat 方法,所以 18.0 肯定是不能用的,通過前面的分析,找到了直接依賴 guava.18.0.jar 的是 smjdbctemplate,解決辦法就是將 smjdbctemplate 中的 guava 排除掉。

<dependency><groupId>com.github.yinjihuan</groupId><artifactId>smjdbctemplate</artifactId><version>1.1</version><exclusions><exclusion><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion></exclusions> </dependency>

還有就是根據依賴樹的深淺度來判斷當前項目依賴的是哪個版本,如下圖:

18.0 是最淺的,肯定是依賴它,其實在 Eclipse 里面直接查看 Maven Dependencies 就可以指定當前項目依賴哪些框架和版本信息,如下圖:

當我們排除掉 18.0 后再來看依賴的版本是 20.0,如下圖:

根據依賴樹的深淺度,20.0 和 19.0 都是一樣的層級,但是 20.0 在 19.0 前面,所以優先選擇 20.0 版本。

再來看項目中的 pom 文件,發現 swagger 的聲明順序在 apollo 的前面。

如果我們把順序調整一下,那么就會依賴 19.0 的版本。


總結

通過我仔細耐心的講解,妹子終于自己解決了遇到的問題,后面的事你們就猜去吧。????

這種問題其實無法避免,當你依賴的三方框架越多的時候,沖突的可能性就越大。碰到問題的時候沉下心來仔細分析,借助于工具幫助你排查問題。

當然我們在自己項目中去依賴三方的框架,也是要注意版本的問題,特別是對于多模塊的項目,每個子模塊都去依賴不同的版本,這樣很容易出問題,一般建議在父 pom 中 dependencyManagement 來統一管理版本,子模塊直接統一使用父 pom 中定義好的版本。

還有就是可以使用 optional 來設置可選依賴,比如說你要封裝一個通用的模塊 Common,這個模塊中有很多通用的功能,項目 A 依賴只需要使用功能 A,項目 B 依賴只需要使用功能 B。

每個功能都依賴了三方的 Jar,這個時候如果你不做任何處理,只要依賴了你這個通用的模塊 Common,那么也就會間接依賴這兩個功能的第三方 Jar。

這個時候可以通過設置 optional=true 來解決這個問題,我依賴了你的通用模塊 Common,如果我要使用 A 功能,那么我必須顯示依賴 A 功能需要的三方依賴才可以。

參考資料

[1] maven: https://maven.apache.org/
[2] mvnrepository: https://mvnrepository.com/

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的好机会,我要帮女同事解决Maven冲突问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩avwww | 在线xxxx| 91吃瓜今日吃瓜入口 | 用我的手指扰乱你 | 免费看成人啪啪 | 中文字幕在线视频一区二区 | 中文字幕18页| 双性人妖互交localhost | 国产在线精品视频 | 色导航 | 中文字幕一区二区人妻在线不卡 | 大地资源二中文在线影视免费观看 | 国产老妇伦国产熟女老妇视频 | 在线免费观看污视频 | 欧美特级黄色录像 | 祥仔视觉av| 婷婷成人综合网 | 99精品欧美一区二区蜜桃免费 | 123超碰| 不卡一区二区在线观看 | 三级中文字幕在线 | 欧美老女人性生活视频 | 一区二区三区www | 国产精品久久久影院 | 成人久久视频 | 老妇女玩小男生毛片 | 久久入口 | 无码人妻黑人中文字幕 | 第一章婶婶的性事 | 色婷婷激情网 | 色偷偷综合网 | 亚欧在线免费观看 | 国产一区二区三区在线视频观看 | 天堂在线观看av | 99热只有这里有精品 | 一区二区三区在线观看av | 国产专区视频 | 久久人人妻人人人人妻性色av | 蜜桃视频在线播放 | 蜜桃网站 | 新婚之夜玷污岳丰满少妇在线观看 | 亚洲精品无人区 | 黄色大片免费网站 | 久久久久9999| 在线看黄色的网站 | 国产精品视频久久 | 97xxxxx| 亚洲国产日本 | 亚洲va欧美va天堂v国产综合 | 自拍偷拍视频在线观看 | 肥婆大荫蒂欧美另类 | www.国产麻豆| 99久久影视 | 午夜一区二区视频 | 亚洲校园激情 | 久久国产福利 | 欧美熟妇精品一区二区蜜桃视频 | 精品国产一二区 | 黄色网日本| 日韩在线免费观看视频 | 国产最爽的乱淫视频国语对白 | 在线www色| 久久久久久99 | 激情久久久久久久 | 亚洲自拍第三页 | 少妇xxxxxx | 久草资源在线视频 | 日韩综合一区二区三区 | 国产偷人爽久久久久久老妇app | 国产又粗又硬 | 美国美女群体交乱 | 国产精品久久久久野外 | 亚洲丝袜中文字幕 | 久久国内精品 | 青青操网站 | 美女午夜视频 | 先锋av资源网 | 99国产精 | av在线资源播放 | 国产第5页| 久操伊人网 | 日本变态折磨凌虐bdsm在线 | 亚洲深爱 | 精品在线免费视频 | 香蕉久久av一区二区三区 | 婷婷色婷婷开心五月四房播播 | 少妇扒开粉嫩小泬视频 | 日日摸夜夜添夜夜添高潮喷水 | 黄色在线视频观看 | 狠狠gao | 日韩簧片| 性五月天| 欧美精品一卡 | 午夜电影网站 | 杨贵妃颤抖双乳呻吟求欢小说 | 欧美自拍偷拍第一页 | 欧美精品第1页 | 天天色天天干天天色 | www..com色|