别再因为Jar包冲突砸键盘了

标签: jar 冲突 键盘 | 发表时间:2022-12-28 17:41 | 作者:东小西
出处:https://juejin.cn/backend

highlight: a11y-dark theme: condensed-night-purple

Maven Jar冲突时我们在开发过程中最常见并且头大的问题,经历几次后,不要再“一顿操作猛如虎,定睛一看原地杵”。先了解一下Jar冲突的原理,再遇到的时候不再“一腔怒火砸键盘”了。

原理

依赖传递

当项目引入A依赖时,同时A依赖引入了B,B可能引入了C。最后,Maven会把所有相关的依赖都添加到项目中,好处是不用自己去添加所有依赖的Jar包了,但是可能会引起Jar冲突。

举个栗子,比如spring boot工程中,引入spring-boot-starter-web:

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

(不同级)最短路径优先原则

两个版本不同的同一个依赖,在不同的级别中,会优先使用路径最短的一个。

  pom -> A -> B -> W(14.0.1)
pom -> A -> C -> D -> W(12.0.1)
最终会优先引入W(14.0.1)。

(同级)声明优先原则

后声明优先:两个版本不同的同一个依赖,若都在第一级,会优选使用后声明的依赖。

  pom -> W(14.0.1)
pom -> W(12.0.1)
最终会优选引入W(12.0.1)。

先声明优先:不在第一级的话,会优选使用先声明的依赖。

  pom -> A -> W(14.0.1)
pom -> B -> W(12.0.1)
最终会优选引入W(14.0.1)。

Jar包冲突原因

首先,在平时开发中可能会因Jar冲突遇到的异常有:

  java.lang.ClassNotFoundException
java.lang.NoSuchMethodError
java.lang.NoClassDefFoundError

根据上面讲的原则,每一个原则都会导致Jar冲突。所谓的Jar冲突,就是项目最终引入的依赖,程序在某个方法使用了低于/高于内设版本的jar包,没有找到对应的类或方法,导致程序错误。

排查Jar冲突

IDEA Maven Diagrams

使用IDEA自带Maven插件,在pom.xml右键,选择Diagrams,点击show Dependencies,查看Maven依赖层级结构。

红色线表示冲突,可以看到Maven选择了哪个版本的依赖。

Maven Helper

安装Maven Helper插件,直接可以看到发生冲突的依赖。

右键可以直接排除冲突的依赖,会自动在pom.xml添加排除属性。

mvn dependency

本地开发可以借助IDEA来排查Jar包冲突,那在测试或生产环境的话,可以使用mvn命令来定位冲突。

  #打印依赖树
mvn dependency:tree 
#将依赖树打印到文件中
mvn dependency:tree > a.txt 
#打印包含某些包的依赖树
mvn dependency:tree -Dincludes=guava

解决Jar包冲突

exclude 排除

在pom.xml通过exclude排除,如下:

         <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
            </exclusions>
        </dependency>

指定版本

在很多情况下,采用exclude排除的话,可能需要排除的位置很多,可以根据上面提到的原则,在pom.xml直接引用指定版本的依赖,这种方式的优先级最高。

其它小技巧

服务器查看Jar包版本

  jar tf jar包名称

相关 [jar 冲突 键盘] 推荐:

别再因为Jar包冲突砸键盘了

- - 掘金 后端
Maven Jar冲突时我们在开发过程中最常见并且头大的问题,经历几次后,不要再“一顿操作猛如虎,定睛一看原地杵”. 先了解一下Jar冲突的原理,再遇到的时候不再“一腔怒火砸键盘”了. 当项目引入A依赖时,同时A依赖引入了B,B可能引入了C. 最后,Maven会把所有相关的依赖都添加到项目中,好处是不用自己去添加所有依赖的Jar包了,但是可能会引起Jar冲突.

Spring boot executable jar/war 原理

- - ImportNew
spring boot里其实不仅可以直接以 Java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来启动,比如./demo.jar. 把这个executable jar/war 链接到/etc/init.d下面,还可以变为Linux下的一个service. 只要在spring boot maven plugin里配置:.

太陽の光をビンにためよう。 Sun Jar/Moon Jar

- GOT4416 - まとめのインテリア
Sun Jar/Moon Jarは、照明です. 陽のあたる窓際に置いておきます. 夕日のようなオレンジ色で発光するSun Jar. 月の光を連想させる涼しげなブルーの光のMoon Jar. こちらのショップで、詳しく紹介されています. 楽天市場ショップ「プラスチック」の商品ページへ. 大手サイトで、この商品を検索しました.

JAVA 动态(手动)加载jar文件

- - CSDN博客编程语言推荐文章
//filePath 是jar的绝对路径. //里面是一个url的数组,可以同时加载多个. //根据类名加载指定类,例:. //通过反射调用类中的方法,例如调用addFile方法,有1个String参数和一个int参数:. 如果有返回值,则直接返回需要的值,例:. 作者:kingboy123000 发表于2013-10-23 16:12:30 原文链接.

从Maven仓库中导出jar包

- - 企业架构 - ITeye博客
从Maven仓库中导出jar包:进入工程pom.xml 所在的目录下,. 输入以下命令:mvn dependency:copy-dependencies -DoutputDirectory=lib. 更简单的  mvn dependency:copy-dependencies    会导出到target\dependency 下面.

maven导出项目依赖的jar包

- - 互联网 - ITeye博客
在进行项目部署时,需要将maven项目所依赖的jar导出到指定目录,本文讲解如何导出项目依赖的jar包. 一、导出到默认目录 targed/dependency .     从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令:.        或在eclipse中,选择项目的pom.xml文件,点击右键菜单中的Run As,见下图红框中,在弹出的Configuration窗口中,输入  dependency:copy-dependencies 后,点击运行.

Weblogic 设置优先引用web项目的jar包

- - ITeye博客
在WEB-INF/weblogic.xml中进行如下配置:. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

spring加载jar包中的多个配置文件

- - 行业应用 - ITeye博客
在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示:. 这样太复杂了,对于一个大的项目而言,要在这里写入太多的配置,影响美观还害怕引入的xml减少. 可以自定义一个applicationContext_all.xml,使用import引入其他配置文件,如下所示:.

jar文件安装到本地的maven仓库

- - 行业应用 - ITeye博客
下面具一个如何把edtftpj.jar 包上传到本地maven仓库的例子. 首先有edtftpj.jar 的jar文件,我把它放到了 D:/ (D盘根目录),. - 进入“命令行提示符”,进入到D:/,然后执行mvn install:install-file -Dfile=edtftpj.jar -DgroupId=com.enterprisedt -DartifactId=edtFTPj -Dversion=2.0.4 -Dpackaging=jar.

既使用maven又使用本地Jar包

- - zzm
maven 使用本地包 lib jar包 依赖一个lib目录. 1. 把本地的lib加入maven编译时的依赖路径.    这种的不好处是,只能加入某个jar包而不是某个目录. 3. 把jar包安装入本地仓库.   - 先安装jar包到本地仓库.   - 引用安装的jar包.       注意: 正规maven的方法,要求jar包中有合法的 artifactId信息.