成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JAR沖突問(wèn)題的解決以及運(yùn)行狀態(tài)下如何查看加載的類

開(kāi)發(fā) 開(kāi)發(fā)工具
今天碰到群里小伙伴問(wèn),線上程序好像有多個(gè)不同版本的Netty包,怎么去看到底加載了哪一個(gè)?

[[376071]]

今天碰到群里小伙伴問(wèn),線上程序好像有多個(gè)不同版本的Netty包,怎么去看到底加載了哪一個(gè)?

在說(shuō)如何看之前,先來(lái)說(shuō)說(shuō),當(dāng)你開(kāi)始意識(shí)到項(xiàng)目里有多個(gè)不同版本的Jar包,都是因?yàn)橛龅搅诉@幾個(gè)異常:

  • 1、java.lang.NoSuchMethodException:自己代碼中調(diào)用了某個(gè)方法,因?yàn)榧虞d了其他版本的jar,這個(gè)版本正好沒(méi)這個(gè)方法。
  • 2、java.lang.NoClassDefFoundError:編譯時(shí)候是好的,但是運(yùn)行的時(shí)候,因?yàn)榧虞d的jar版本問(wèn)題,沒(méi)有這個(gè)類。
  • 3、java.lang.ClassNotFoundException:在動(dòng)態(tài)加載某個(gè)Class的時(shí)候,因?yàn)橐虞d的jar不是正確的版本,而導(dǎo)致找不到這個(gè)類。

當(dāng)你在本地運(yùn)行ok,但到服務(wù)器上發(fā)現(xiàn)出現(xiàn)這些錯(cuò)誤的時(shí)候,就要意識(shí)到很可能是jar沖突了(有相同依賴存在多個(gè)版本)。這個(gè)問(wèn)題往往也會(huì)有這樣的表現(xiàn):多實(shí)例部署的時(shí)候,有的實(shí)例是好的,有的實(shí)例則不行。

查看加載的類和方法

根據(jù)之前分析的異常種類,我們可以去運(yùn)行中的現(xiàn)場(chǎng)確認(rèn)當(dāng)前加載的問(wèn)題。

這里我們可以使用阿里開(kāi)源的Arthas工具,如果第一次用,那么按下面操作先安裝再運(yùn)行:

  1. curl -O https://arthas.aliyun.com/arthas-boot.jar 
  2. java -jar arthas-boot.jar 

運(yùn)行好之后,會(huì)打印出當(dāng)前運(yùn)行著的java應(yīng)用,比如:

  1. [INFO] arthas-boot version: 3.4.6 
  2. [INFO] Process 40611 already using port 3658 
  3. [INFO] Process 40611 already using port 8563 
  4. [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. 
  5. * [1]: 40611 chapter4-3-0.0.1-SNAPSHOT.jar 
  6.   [2]: 37786 

通過(guò)輸入編號(hào)選擇要查看的java應(yīng)用,比如這里選擇:1,進(jìn)入到chapter4-3-0.0.1-SNAPSHOT.jar中去。

下面介紹兩個(gè)重要命令:

第一個(gè):sc命令,我們確認(rèn)一下可能沖突的jar包下面,是否有對(duì)應(yīng)的class。有些不同版本包下class就不一樣,馬上就可以分辨出來(lái)。

比如,通過(guò)下面的命令,我們查看一下com.didispace包下有什么類:

  1. [arthas@40611]$ sc com.didispace.* 
  2. com.didispace.chapter43.Chapter43Application 
  3. com.didispace.chapter43.Chapter43Application$$EnhancerBySpringCGLIB$$8b82b194 
  4. com.didispace.chapter43.UploadController 
  5. Affect(row-cnt:3) cost in 6 ms. 

第二個(gè):sm命令,查看具體某個(gè)類有哪些方法。有的版本差異就是去掉了某個(gè)方法,這個(gè)時(shí)候我們就可以通過(guò)這個(gè)命令來(lái)查看。

比如,通過(guò)下面的命令,我們查看一下com.didispace.chapter43.UploadController類下有些什么方法:

  1. [arthas@40611]$ sm com.didispace.chapter43.UploadController 
  2. com.didispace.chapter43.UploadController <init>()V 
  3. com.didispace.chapter43.UploadController create(Lorg/springframework/web/multipart/MultipartFile;)Ljava/lang/String; 
  4. com.didispace.chapter43.UploadController uploadPage()Ljava/lang/String; 
  5. Affect(row-cnt:3) cost in 5 ms. 

找到?jīng)_突并解決沖突

在確認(rèn)完是加載錯(cuò)誤的情況下,我們要去解決沖突。那么解決沖突要做的就是找到到底哪里沖突了以及我們要去除或者強(qiáng)制

找出版本沖突的方法:使用Maven命令:mvn -U dependency:tree -Dverbose。

命令執(zhí)行之后,會(huì)在控制臺(tái)以樹(shù)狀形式列出所有依賴內(nèi)容,然后通過(guò)搜索的方式查找沖突的包,看看都是從哪個(gè)依賴中帶進(jìn)來(lái)的(在IDEA中搜索會(huì)高亮,更容易找到)。

  1. [INFO] com.didispace:chapter4-3:jar:0.0.1-SNAPSHOT 
  2. [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.4.1:compile 
  3. [INFO] |  +- org.springframework.boot:spring-boot-starter:jar:2.4.1:compile 
  4. [INFO] |  |  +- org.springframework.boot:spring-boot:jar:2.4.1:compile 
  5. [INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:2.4.1:compile 
  6. [INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.4.1:compile 
  7. [INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.2.3:compile 
  8. [INFO] |  |  |  |  \- ch.qos.logback:logback-core:jar:1.2.3:compile 
  9. [INFO] |  |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.13.3:compile 
  10. [INFO] |  |  |  |  \- org.apache.logging.log4j:log4j-api:jar:2.13.3:compile 
  11. [INFO] |  |  |  \- org.slf4j:jul-to-slf4j:jar:1.7.30:compile 
  12. [INFO] |  |  +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile 
  13. [INFO] |  |  \- org.yaml:snakeyaml:jar:1.27:compile 
  14. [INFO] |  +- org.springframework.boot:spring-boot-starter-json:jar:2.4.1:compile 
  15. [INFO] |  |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.11.3:compile 
  16. [INFO] |  |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.11.3:compile 
  17. [INFO] |  |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.11.3:compile 
  18. [INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.11.3:compile 
  19. [INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.11.3:compile 
  20. [INFO] |  |  \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.11.3:compile 
  21. [INFO] |  +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.4.1:compile 
  22. [INFO] |  |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.41:compile 
  23. [INFO] |  |  +- org.glassfish:jakarta.el:jar:3.0.3:compile 
  24. [INFO] |  |  \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.41:compile 
  25. [INFO] |  +- org.springframework:spring-web:jar:5.3.2:compile 
  26. [INFO] |  |  \- org.springframework:spring-beans:jar:5.3.2:compile 
  27. [INFO] |  \- org.springframework:spring-webmvc:jar:5.3.2:compile 
  28. [INFO] |     +- org.springframework:spring-aop:jar:5.3.2:compile 
  29. [INFO] |     +- org.springframework:spring-context:jar:5.3.2:compile 
  30. [INFO] |     \- org.springframework:spring-expression:jar:5.3.2:compile 
  31. [INFO] +- org.springframework.boot:spring-boot-starter-thymeleaf:jar:2.4.1:compile 
  32. [INFO] |  +- org.thymeleaf:thymeleaf-spring5:jar:3.0.11.RELEASE:compile 
  33. [INFO] |  |  +- org.thymeleaf:thymeleaf:jar:3.0.11.RELEASE:compile 
  34. [INFO] |  |  |  +- org.attoparser:attoparser:jar:2.0.5.RELEASE:compile 

解決版本沖突的方式主要兩種:

  • 1、通過(guò)上面的命令找到不需要的版本之后,在引入的依賴中,使用exclusions將其排除,比如下面這樣:
  1. <dependency> 
  2.         <groupId>org.springframework.boot</groupId> 
  3.         <artifactId>spring-boot-starter-jdbc</artifactId> 
  4.         <exclusions> 
  5.                 <exclusion> 
  6.                         <groupId>xxx</groupId> 
  7.                         <artifactId>yyy</artifactId> 
  8.                 </exclusion> 
  9.         </exclusions></dependency> 
  • 2、在pom.xml中強(qiáng)制指定要使用的版本,這樣這個(gè)優(yōu)先級(jí)最高,就不會(huì)引入其他版本要帶進(jìn)來(lái)的版本了。

 

好了,今天的分享到這里結(jié)束了,希望對(duì)你有所幫助。如果您覺(jué)得本文有用,歡迎轉(zhuǎn)發(fā)擴(kuò)散!

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2020-07-03 07:59:01

Linux服務(wù)systemd

2011-04-01 16:23:14

Cacti監(jiān)控Nginx

2010-06-09 17:01:48

路由選擇協(xié)議

2014-08-13 14:48:01

LinuxShell腳本

2010-08-16 14:16:28

DB2實(shí)例

2019-06-03 15:52:21

WindowsLinux端口

2021-10-05 22:09:31

Jar加載機(jī)制

2011-09-08 18:28:03

windowsXP鎖定狀態(tài)

2012-02-09 10:31:17

Java

2009-08-28 16:16:02

線程運(yùn)行狀態(tài)

2023-06-15 08:06:55

gogolang通信

2010-08-23 10:27:14

恢復(fù)IOS

2012-03-06 09:20:02

ibmdw

2013-05-21 10:49:59

Windows硬件沖突

2019-12-01 22:08:04

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

2023-10-10 09:19:59

日志Java

2011-03-25 13:26:45

Cacti

2018-05-18 10:22:39

沖突游戲服務(wù)器

2025-03-31 04:25:00

2022-04-06 21:29:44

邊緣計(jì)算數(shù)據(jù)存儲(chǔ)數(shù)據(jù)中心
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产精品美女久久久 | 日韩久草 | 欧美男人天堂 | 欧美日韩在线观看一区 | 亚洲人成人一区二区在线观看 | 亚洲精品国产电影 | 日日草夜夜草 | 91av久久久| 国产精品不卡视频 | 欧美日韩精品一区二区三区四区 | 国产亚洲一区二区三区在线 | 日韩一区二区免费视频 | 国产精品一区二区免费 | 天天拍天天操 | 天天干天天草 | 精品一二三区 | 国产日韩欧美精品一区二区 | 美女福利视频网站 | 日日草天天干 | 国产欧美日韩精品一区 | 97超碰免费 | 成人免费观看视频 | 日韩久久网 | 亚洲午夜精品久久久久久app | 久久久久久九九九九九九 | 精品久久久久久久久久久久 | 伊人网综合在线观看 | 日韩av免费看 | 天堂在线网 | 综合国产| 日韩精品一区二 | av国产精品毛片一区二区小说 | www国产成人 | 毛片a区| 国产精品久久久久久久久久三级 | 九九热这里 | 伊人网在线综合 | 中文字幕在线网 | 国产美女精品视频 | 免费观看一级特黄欧美大片 | 亚洲激情综合网 |