偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

好機(jī)會(huì),我要幫女同事解決Maven沖突問(wèn)題

開(kāi)發(fā) 前端
其實(shí)在工作中經(jīng)常會(huì)遇到這種沖突的問(wèn)題,比如:Caused by:java.lang.NoSuchMethodError 這個(gè)異常信息也是沖突導(dǎo)致的,想要解決沖突問(wèn)題就必須得知道哪里沖突了(好像是廢話(huà))。大部分都是用 Maven 來(lái)管理依賴(lài)的 Jar,今天這篇文章主要是講解如何解決 Maven 帶來(lái)的依賴(lài)沖突問(wèn)題。

任何一個(gè)故事起因最重要

任何一個(gè)職業(yè),女生都有絕對(duì)的優(yōu)勢(shì)。更別提 IT 行業(yè)了,在部門(mén)中要是有女程序猿那肯定是香餑餑,備受呵護(hù)呀。

 

 

 

[[314872]]

 

之前有一次,一位剛來(lái)的妹子遇到問(wèn)題了,畫(huà)風(fēng)頓時(shí)就變成上面的圖片了,群起而圍之,但是最后的結(jié)果并不理想,還是得我出馬(此處有點(diǎn)小吹牛)。

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

其實(shí)在工作中經(jīng)常會(huì)遇到這種沖突的問(wèn)題,比如:Caused by:java.lang.NoSuchMethodError 這個(gè)異常信息也是沖突導(dǎo)致的,想要解決沖突問(wèn)題就必須得知道哪里沖突了(好像是廢話(huà))。

大部分都是用 Maven 來(lái)管理依賴(lài)的 Jar,今天這篇文章主要是講解如何解決 Maven 帶來(lái)的依賴(lài)沖突問(wèn)題。

Maven 回顧

Maven 自述

Maven 是用于構(gòu)建和管理 Java 項(xiàng)目的工具。對(duì)于 Java 方向的來(lái)說(shuō),Maven 幾乎都要接觸和使用。當(dāng)然也有其他的工具來(lái)代替 Maven,比如 Ant 和 Gradle。

之前有接觸過(guò) Grails 構(gòu)建的 Java Web 項(xiàng)目,就是用 Gradle 來(lái)做依賴(lài)管理的。至于 Ant 也在剛工作的時(shí)候在一些老項(xiàng)目中有見(jiàn)到過(guò),后面幾乎沒(méi)見(jiàn)過(guò)了。

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

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

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

比如我們想要使用 Spring Boot,除了在 Spring 的文檔中獲取依賴(lài)的版本,也可以自己去搜索,選擇對(duì)應(yīng)的版本,如下圖:

 

 

 

 

可以看到默認(rèn)就是 Maven 的依賴(lài)方式,只需要將 dependency 整段內(nèi)容復(fù)制到項(xiàng)目的 pom.xml 文件中即可。右側(cè)還有很多其他的依賴(lài)方式,比如 Gradle 等。

Maven 依賴(lài)傳遞

今天主要講下如何去解決 Maven 做依賴(lài)管理的時(shí)候 Jar 包沖突的問(wèn)題,在解決之前先來(lái)了解下基本的知識(shí)。

 

 

 

 

上圖展示了 Maven 的依賴(lài)傳遞性,首先是項(xiàng)目 B 中依賴(lài)了 Spring 和 Guava 兩個(gè)框架。然后項(xiàng)目 A 又依賴(lài)了項(xiàng)目 B,所以項(xiàng)目 A 也會(huì)依賴(lài) Spring 和 Guava 兩個(gè)框架。

依賴(lài)傳遞 Jar 包選擇邏輯依賴(lài)性傳遞會(huì)導(dǎo)致項(xiàng)目中依賴(lài)很多其他版本的 Jar,這種情況下怎么進(jìn)行 Jar 包的選擇呢?

有兩個(gè)規(guī)則:

  • 不同距離,距離近優(yōu)先
  • 相同距離,前者優(yōu)先

如下圖所示,項(xiàng)目依賴(lài)了項(xiàng)目 A 和項(xiàng)目 B,A 和 B 分別依賴(lài)了 Guava,但是從依賴(lài)層次來(lái)看,項(xiàng)目 B 的層次更淺,故 Guava18.0 會(huì)被優(yōu)先選擇。

 

 

 

 

當(dāng)距離相同的時(shí)候,就會(huì)優(yōu)先選擇定義在前面的,如下圖所示,項(xiàng)目 A 和項(xiàng)目 B 都分別依賴(lài)了 Guava15.0 和 Guava18.0 的版本,但是項(xiàng)目 A 的順序在項(xiàng)目 B 的前面,所以會(huì)優(yōu)先選擇 Guava15.0 版本。

 

 

 

 

通過(guò)依賴(lài)傳遞性經(jīng)常會(huì)導(dǎo)致 Jar 包沖突的問(wèn)題,比如下圖的項(xiàng)目 A 本身依賴(lài)了 Guava15.0,然后又依賴(lài)了項(xiàng)目 B,項(xiàng)目 B 中依賴(lài)了 Guava18.0,這樣項(xiàng)目 A 就會(huì)同時(shí)依賴(lài) Guava15.0 和 Guava18.0。

如果剛好用到了高版本不兼容低版本的方法和類(lèi)時(shí),就會(huì)出現(xiàn)選擇錯(cuò)誤,因?yàn)?Maven 會(huì)根據(jù)依賴(lài)樹(shù)的深淺來(lái)選型淺的依賴(lài),也就是 15.0。

 

 

 

 

沖突案例

下面就是一個(gè)典型的 Jar 包沖突問(wèn)題,當(dāng)一個(gè) Jar 有多個(gè)版本的時(shí)候,就會(huì)出現(xiàn)沖突。

錯(cuò)誤信息可以看到 com.google.common.collect.FluentIterable.concat 這個(gè)方法找不到,目前是從 guava-18.0.jar 中加載的,這種問(wèn)題我們?cè)撛趺唇鉀Q呢?

 

  1. Description: 
  2. 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: 
  3.     jar:file:/Users/yinjihuan/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jar!/com/google/common/collect/FluentIterable.class 
  4. It was loaded from the following location: 
  5.     file:/Users/yinjihuan/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jar 
  6.  
  7. Action
  8. Correct the classpath of your application so that it contains a single, compatible version of com.google.common.collect.FluentIterable 

解決思路之懸絲診脈

找出沖突的 Jar,看看當(dāng)前項(xiàng)目中依賴(lài)了哪幾個(gè)版本。

Eclipse

在 Eclipse 中可以雙擊 pom 文件,進(jìn)入 Dependency 視圖,輸入你要搜索的 jar 名稱(chēng)進(jìn)行搜索,就可以看出當(dāng)前項(xiàng)目中哪些框架依賴(lài)了你搜索的 jar,什么版本都能知道。

 

 

 

 

Idea

Idea 中可以安裝 maven helper 插件來(lái)查看相關(guān)依賴(lài)信息,默認(rèn)選中 Conflicts 會(huì)展示當(dāng)前項(xiàng)目存在沖突的依賴(lài),當(dāng)然我們也可以直接查看樹(shù)形的依賴(lài)關(guān)系去分析沖突。

 

 

 

 

Maven 命令

不用不借助于開(kāi)發(fā)工具的插件,我們可以直接用 Maven 命令來(lái)查看當(dāng)前項(xiàng)目的依賴(lài)關(guān)系,命令行進(jìn)入到你要分析的項(xiàng)目目錄下,執(zhí)行下面的命令將分析結(jié)果保存到文件中:

 

  1. mvn dependency:tree > tree.log 

執(zhí)行完之后依賴(lài)的信息結(jié)構(gòu)如下:

 

 

 

 

搜索了下 guava,發(fā)現(xiàn)在 smjdbctemplate 中依賴(lài)了 18.0 版本,這個(gè)框架是我自己基于 jdbctemplate 封裝的一個(gè)框架。

 

 

 

 

解決思路之察言觀色其實(shí)很明顯,錯(cuò)誤信息已經(jīng)告訴我們 18.0 中找不到 concat 方法,所以 18.0 肯定是不能用的,通過(guò)前面的分析,找到了直接依賴(lài) guava.18.0.jar 的是 smjdbctemplate,解決辦法就是將 smjdbctemplate 中的 guava 排除掉。

  1. <dependency> 
  2.   <groupId>com.github.yinjihuan</groupId> 
  3.   <artifactId>smjdbctemplate</artifactId> 
  4.   <version>1.1</version> 
  5.   <exclusions> 
  6.     <exclusion> 
  7.       <groupId>com.google.guava</groupId> 
  8.       <artifactId>guava</artifactId> 
  9.     </exclusion> 
  10.   </exclusions> 
  11. </dependency> 

 

還有就是根據(jù)依賴(lài)樹(shù)的深淺度來(lái)判斷當(dāng)前項(xiàng)目依賴(lài)的是哪個(gè)版本,如下圖:

 

 

 

 

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

 

 

 

 

當(dāng)我們排除掉 18.0 后再來(lái)看依賴(lài)的版本是 20.0,如下圖:

 

 

 

 

根據(jù)依賴(lài)樹(shù)的深淺度,20.0 和 19.0 都是一樣的層級(jí),但是 20.0 在 19.0 前面,所以?xún)?yōu)先選擇 20.0 版本。

再來(lái)看項(xiàng)目中的 pom 文件,發(fā)現(xiàn) swagger 的聲明順序在 apollo 的前面。

 

 

 

 

如果我們把順序調(diào)整一下,那么就會(huì)依賴(lài) 19.0 的版本。

 

 

 

 

總結(jié)

通過(guò)我仔細(xì)耐心的講解,妹子終于自己解決了遇到的問(wèn)題,后面的事你們就猜去吧。😆

這種問(wèn)題其實(shí)無(wú)法避免,當(dāng)你依賴(lài)的三方框架越多的時(shí)候,沖突的可能性就越大。碰到問(wèn)題的時(shí)候沉下心來(lái)仔細(xì)分析,借助于工具幫助你排查問(wèn)題。

當(dāng)然我們?cè)谧约喉?xiàng)目中去依賴(lài)三方的框架,也是要注意版本的問(wèn)題,特別是對(duì)于多模塊的項(xiàng)目,每個(gè)子模塊都去依賴(lài)不同的版本,這樣很容易出問(wèn)題,一般建議在父 pom 中 dependencyManagement 來(lái)統(tǒng)一管理版本,子模塊直接統(tǒng)一使用父 pom 中定義好的版本。

還有就是可以使用 optional 來(lái)設(shè)置可選依賴(lài),比如說(shuō)你要封裝一個(gè)通用的模塊 Common,這個(gè)模塊中有很多通用的功能,項(xiàng)目 A 依賴(lài)只需要使用功能 A,項(xiàng)目 B 依賴(lài)只需要使用功能 B。每個(gè)功能都依賴(lài)了三方的 Jar,這個(gè)時(shí)候如果你不做任何處理,只要依賴(lài)了你這個(gè)通用的模塊 Common,那么也就會(huì)間接依賴(lài)這兩個(gè)功能的第三方 Jar。這個(gè)時(shí)候可以通過(guò)設(shè)置 optional=true 來(lái)解決這個(gè)問(wèn)題,我依賴(lài)了你的通用模塊 Common,如果我要使用 A 功能,那么我必須顯示依賴(lài) A 功能需要的三方依賴(lài)才可以。

 

責(zé)任編輯:武曉燕 來(lái)源: 猿天地
相關(guān)推薦

2020-02-22 08:02:07

春節(jié)疫情防控口罩

2020-08-24 07:52:40

代理Java動(dòng)態(tài)

2009-04-03 15:17:43

LinuxWindows 7機(jī)會(huì)

2009-04-04 09:36:11

Windows 7微軟操作系統(tǒng)

2023-10-11 12:35:29

Maven

2017-12-27 15:27:36

大數(shù)據(jù)數(shù)據(jù)建模數(shù)據(jù)支撐

2024-02-28 08:41:51

Maven沖突版本

2013-05-21 10:49:59

Windows硬件沖突

2010-02-24 16:47:22

戴爾員工性騷擾

2021-04-07 22:22:10

人工智能數(shù)據(jù)軟件

2019-12-01 22:08:04

Mavenjar包開(kāi)發(fā)

2021-07-07 11:15:05

文件前端瀏覽器

2013-09-22 11:41:38

SAP

2019-08-23 11:04:29

人生第一份工作百度程序員

2009-11-12 17:24:44

無(wú)線(xiàn)路由器常見(jiàn)問(wèn)題

2010-01-12 10:28:58

C++復(fù)雜性

2022-02-19 22:02:21

Redisvalue元素

2022-03-23 08:01:04

Python語(yǔ)言代碼

2009-06-30 17:16:43

jsp網(wǎng)站開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)