精华内容
下载资源
问答
  • Maven中 jar包冲突原理与解决办法

    万次阅读 多人点赞 2018-07-20 19:57:34
    Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题。本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲突的解决办法。

    Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题。本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲突的解决办法。

    一、Maven中jar包冲突产生原因

    MAVEN项目运行中如果报如下错误:

    Caused by:java.lang.NoSuchMethodError
    Caused by: java.lang.ClassNotFoundException
    
    

    十有八九是Maven jar包冲突造成的。那么jar包冲突是如何产生的?

    首先我们需要了解jar包依赖的传递性。

    1、依赖传递

    当我们需要A的依赖的时候,就会在pom.xml中引入A的jar包;而引入的A的jar包中可能又依赖B的jar包,这样Maven在解析pom.xml的时候,会依次将A、B 的jar包全部都引入进来。

    举个例子:
    在Spring Boot应用中导入Hystrix和原生Guava的jar包:

    <!--原生Guava API-->
    <dependency>
    	<groupId>com.google.guava</groupId>
    	<artifactId>guava</artifactId>
    	<version>20.0</version>
    </dependency>
    
    <!--hystrix依赖(包含对Guava的依赖)-->
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    	<version>1.4.4.RELEASE</version>
    </dependency>
    

    利用Maven Helper插件得到项目导入的jar包依赖树:
    这里写图片描述
    从图中可以看出Hystrix包含对Guava jar包依赖的引用: Hystrix -> Guava,所以在引入Hystrix的依赖的时候,会将Guava的依赖也引入进来。

    2、jar包冲突原理

    那么jar包是如何产生冲突的?
    假设有如下依赖关系:

    A->B->C->D1(log 15.0):A中包含对B的依赖,B中包含对C的依赖,C中包含对D1的依赖,假设是D1是日志jar包,version为15.0

    E->F->D2(log 16.0):E中包含对F的依赖,F包含对D2的依赖,假设是D2是同一个日志jar包,version为16.0

    当pom.xml文件中引入A、E两个依赖后,根据Maven传递依赖的原则,D1、D2都会被引入,而D1、D2是同一个依赖D的不同版本。
    当我们在调用D2中的method1()方法,而D1中是15.0版本(method1可能是D升级后增加的方法),可能没有这个方法,这样JVM在加载A中D1依赖的时候,找不到method1方法,就会报NoSuchMethodError的错误,此时就产生了jar包冲突。

    注:
    如果在调用method2()方法的时候,D1、D2都含有这个方法(且升级的版本D2没有改动这个方法,这样即使D有多个版本,也不会产生版本冲突的问题。)

    举个例子:
    这里写图片描述
    利用Maven Helper插件分析得出:Guava这个依赖包产生冲突。
    我们之前导入了Guava的原生jar包,版本号是20.0;而现在提示Guava产生冲突,且冲突发生位置是Hystrix所在的jar包,所以可以猜测Hystrix中包含了对Guava不同版本的jar包的引用。

    为了验证我们的猜想,使用Maven Helper插件打印出Hystrix依赖的jar tree:
    这里写图片描述
    可以看到:Hystrix jar中所依赖的Guava jar包是15.0版本的,而我们之前在pom.xml中引入的原生Guava jar包是20.0版本的,这样Guava就有15.0 与20.0这两个版本,因此发生了jar包冲突。

    二、 Maven中jar包冲突的解决方案

    Maven 解析 pom.xml 文件时,同一个 jar 包只会保留一个,那么面对多个版本的jar包,需要怎么解决呢?

    1、 Maven默认处理策略

    • 最短路径优先

    Maven 面对 D1 和 D2 时,会默认选择最短路径的那个 jar 包,即 D2。E->F->D2 比 A->B->C->D1 路径短 1。

    • 最先声明优先

    如果路径一样的话,如: A->B->C1, E->F->C2 ,两个依赖路径长度都是 2,那么就选择最先声明。

    2、移除依赖:用于排除某项依赖的依赖jar包

    (1)我们可以借助Maven Helper插件中的Dependency Analyzer分析冲突的jar包,然后在对应标红版本的jar包上面点击execlude,就可以将该jar包排除出去。
    这里写图片描述
    再刷新以后冲突就会消失。

    (2)手动排除
    或者手动在pom.xml中使用<exclusion>标签去排除冲突的jar包(上面利用插件Maven Helper中的execlude方法其实等同于该方法):

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    		<version>1.4.4.RELEASE</version>
    		<exclusions>
    			<exclusion>
    				<groupId>com.google.guava</groupId>
    				<artifactId>guava</artifactId>
    			</exclusion>
    	</exclusions>
    </dependency>
    

    mvn分析包冲突命令:

    mvn dependency:tree
    

    3 版本锁定原则:一般用在继承项目的父项目中

    正常项目都是多模块的项目,如moduleA和moduleB共同依赖X这个依赖的话,那么可以将X抽取出来,同时设置其版本号,这样X依赖在升级的时候,不需要分别对moduleA和moduleB模块中的依赖X进行升级,避免太多地方(moduleC、moduleD…)引用X依赖的时候忘记升级造成jar包冲突,这也是实际项目开发中比较常见的方法。

    首先定义一个父pom.xml,将公共依赖放在该pom.xml中进行声明:

    <properties>
        <spring.version>spring4.2.4</spring.version>
    <properties>
    
    <dependencyManagement>
        <dependencies>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-beans</artifactId>
    			<version>${spring.versio}</version>
    		</dependency>
    	</dependencies>
    </dependencyManagement>
    

    这样如moduleA和moduleB在引用Spring-beans jar包的时候,直接使用父pom.xml中定义的公共依赖就可以:
    moduleA在其pom.xml使用spring-bean的jar包(不用再定义版本):

    <dependencies>
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-beans</artifactId>
    	</dependency>
    </dependencies>
    

    moduleB在其pom.xml使用spring-bean的jar包如上类似:

    <dependencies>
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-beans</artifactId>
    	</dependency>
    </dependencies>
    

    以上就是日常开发中解决Maven冲突的几个小方案,当然实际开发中jar包冲突的问题可能远远比这个更复杂,需要具体问题具体处理。


    2018/07/20 15:14:00 in SH.

    参考:https://blog.csdn.net/u011955252/article/details/78927427

    展开全文
  • maven依赖jar包冲突的解决思路

    万次阅读 2020-04-08 15:18:17
    目的是提供maven依赖jar包冲突的解决思路 需求场景: jackson-databind、fastjson 高危远程代码执行漏洞修复。Jackson-databind,版本号升级为2.10.3;fastjson,版本号升级为1.2.66 问题描述: 对需求...

    注:

    目的是提供maven依赖jar包冲突的解决思路

     

     

    需求场景:

    jackson-databind、fastjson 高危远程代码执行漏洞修复。Jackson-databind,版本号升级为2.10.3;fastjson,版本号升级为1.2.66

     

     

    问题描述:

    对需求中提到的2个工具包进行版本升级后,出现很多找不到方法的报错,比如:

    Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonMerge

     

     

    问题排查:

    1、是否方法对应的jar包未引入?

    通过查看得知,提到“找不到的方法”来自包jackson-databind,而在maven的依赖架构中可以看到,该jar包已经存在,但是仔细一看,问题浮现眼前

     

    2、上述问题极有可能是版本冲突导致

    根据上图可以看到,已经更新了jackson-databind的版本为2.10.3,但是由于引入了其他jar包,其他jar包又依赖了jackson-databind等json工具相关包,版本是2.4.1

     

     

    尝试解决:

    1、排除resteasy-jackson2-provider包中json工具相关包的依赖,并重新显示引入2.10.3版本的jar包。

    如下:

    <dependency>

       <groupId>org.jboss.resteasy</groupId>

       <artifactId>resteasy-jackson2-provider</artifactId>

       <exclusions>

           <exclusion>

              <artifactId>jackson-databind</artifactId>

              <groupId>com.fasterxml.jackson.core</groupId>

           </exclusion>

           <exclusion>

              <artifactId>jackson-core</artifactId>

              <groupId>com.fasterxml.jackson.core</groupId>

           </exclusion>

           <exclusion>

              <artifactId>jackson-annotations</artifactId>

              <groupId>com.fasterxml.jackson.core</groupId>

           </exclusion>

           <exclusion>

              <artifactId>jackson-jaxrs-json-provider</artifactId>

              <groupId>com.fasterxml.jackson.jaxrs</groupId>

           </exclusion>

       </exclusions>

    </dependency>

    <dependency>

       <groupId>com.fasterxml.jackson.core</groupId>

       <artifactId>jackson-databind</artifactId>

       <version>2.10.3</version>

    </dependency>

    <dependency>

       <groupId>com.fasterxml.jackson.jaxrs</groupId>

       <artifactId>jackson-jaxrs-json-provider</artifactId>

       <version>2.10.3</version>

    </dependency>

     

    2、再次查看maven依赖架构(eclipse)

    发现版本都变成统一的2.10.3了。

     

    重启应用,问题不再,运气真好!

     

     

    附:

    查看maven依赖架构,打开工程的pom.xml,选择第3个标签,如下图:

     

     

    展开全文
  • IntelliJ IDEA 自带的Diagrams 去查看jar包冲突相当费劲 ~ ,安装个插件即可快速解决该问题 打开Settings,搜索maven helper,并安装 安装完成后,直接打开pom文件,点击Dependency Analyzer 删除冲突jar包,...

      IntelliJ IDEA 自带的Diagrams 去查看jar包冲突相当费劲 ~ ,安装个插件即可快速解决该问题

    打开Settings,搜索maven helper,并安装

     安装完成后,直接打开pom文件,点击Dependency Analyzer

     删除冲突jar包,在右侧右键冲突jar,选择Exclude

    此时已经更新成功,可以点击Refresh UI 查看结果

     

    展开全文
  • IDEA maven解决包冲突

    2020-09-21 11:18:28
    在编程过程中难免遇到包冲突 点击MAVEN 查看包冲突 右键放大 假如看到有红色的线就是包冲突 找到对应的包 删掉即可

    在编程过程中难免遇到包冲突
    点击MAVEN
    在这里插入图片描述
    查看包冲突
    在这里插入图片描述
    右键放大
    假如看到有红色的线就是包冲突
    找到对应的包
    删掉即可

    展开全文
  • jar包冲突解决思路

    千次阅读 2019-09-30 09:02:44
    工作中,难免会因为各种原因需要对项目jar包进行升级,一升级,就会碰到各种jar包冲突问题,这时候就需要我们能很快定位冲突的位置,以及如何快速调整依赖。 首先,我们通常说的jar包冲突到底是指什么? jar包冲突...
  • kettle jar包冲突

    2018-09-28 16:57:58
    kettle中之前要写java脚本连接hbase,所以导入了很多依赖包。现在使用kettle中的hadoop文件转移控件报错,排查之后因为jar包冲突,冲突的jar包为hadoop-common-2.5.1.jar   ...
  • idea解决jar包冲突

    2019-09-10 17:10:45
    吐血找了一天的问题,最后是jar包冲突导致。事实证明敲代码还是不能浮躁。记录一下排除jar包冲突的方法,so easy 1、打开jar包冲突的类,ctrl+n 2、idea左上角的定位jar包按钮,找到冲突的jar 3、在library里打开,...
  • Maven解决jar包冲突

    千次阅读 2014-09-16 16:45:11
    Maven解决jar包冲突
  • Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题。本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲突的解决办法。 一、Maven...
  • maven-enforcer-plugin快速解决jar包冲突方法,如commons-logging:jar:1.2包冲突解决方法 1.maven-enforcer-plugin 这个插件的作用就是检查是否有jar包冲突,并且可以快速定位到冲突的包。 pom导入 <profiles&...
  • jar包冲突解决

    千次阅读 2016-01-12 09:51:32
    对于Jar包冲突问题,我们开发人员经常都会有碰到,当我们使用一些jar包中的类、方法等,或者有时遇到一些日志系统的问题,我们会遇到ClassNotFoundException,NoSuchFieldException,NoSuchMethodException 之类的...
  • IDEA中解决 maven 包冲突 idea 中解决maven 包冲突的问题(maven helper)
  • Jar包冲突解决方法

    万次阅读 多人点赞 2016-01-13 19:53:16
    对于Jar包冲突问题,我们开发人员经常都会有碰到,当我们使用一些jar包中的类、方法等,或者有时遇到一些日志系统的问题(参考另一篇文章Jar包冲突导致的日志问题),我们会遇到ClassNotFoundException,...
  • jar包冲突原因分析

    千次阅读 2019-05-25 17:29:00
    jar包冲突原因 项目 leaf-verb-a(简称a),leaf-verb-b(简称b),leaf-verb-c(简称c),leaf-verb-d(简称d),leaf-verb-e(简称e) 造成jar包冲突的原因主要有两种,第一种是一个项目,依赖了同一个项目的两个...
  • 导致jar包冲突的原因

    2018-02-09 13:38:26
    jar包冲突几乎是每个java程序员都会遇到的问题,而且特别是大工程,jar包各种依赖,经常性发生包冲突。通常会报这样几个运行时异常:java.lang.NoSuchMehodErrorjava.lang.NoClassDefFoundError这类问题十有八九都是...
  • Android中androidx包和v4包冲突

    千次阅读 2020-08-31 14:17:21
    androidX和V4包冲突 Duplicate class android.support.v4.app.INotificationSideChannel found in modules classes 解决方法: 在项目主目录下的gradle.properties中添加以下代码 android.enableJetifier=true ...
  • 在IDEA中解决jar包冲突

    千次阅读 2019-08-15 09:40:00
    在开发过程中,经常会遇到导入jar包后jar包冲突的情况,大家也都知道,解决jar包冲突通常都比较麻烦,要找到多余的依赖,把低版本的依赖去掉。而大家通常能搜到IDEA解决jar包冲突的方法,应该是这样的: 或者是...
  • Android Studio 引入Jar包,Jar包冲突问题总结,V4 V7包冲突解决
  • 安卓解决包冲突问题。

    千次阅读 2019-12-24 11:42:59
    在安卓开发中,当我们项目中依赖的远程包里面有一模一样的包存在时就会导致包冲突,我们常用的解决方式就是删除任意包里面的包的方式解决冲突。 android studio也告诉了我们如何添加编译依赖项,我们只要按照规范来...
  • Maven JAR包冲突问题排查及解决方案

    万次阅读 多人点赞 2018-08-17 15:23:05
    前言 写这篇文章的初衷是因为今天在使用mvn dependency:tree命令时,突然想起一年前面试阿里的一道面试题。面试题是说假设线上发生JAR包冲突,...现在回头想想确实太不专业了,以下是一次JAR包冲突的一个比较正规...
  • Jar包冲突是老生常谈的问题,几乎每一个Java程序猿都不可避免地遇到过,并且也都能想到通常的原因一般是同一个Jar包由于maven传递依赖等原因被引进了多个不同的版本而导致,可采用依赖排除、依赖管理等常规方式来...
  • Flowable与Tomcat EL包冲突问题

    千次阅读 2019-01-29 23:38:30
    本文重点讲解Flowable与Tomcat EL包冲突如何解决问题。解决思路很简单,因为flowable内置的是JUEL包,所以在使用的时候,直接排除JUEL包即可。具体思路如下: 错误日志以及问题排查 最近好多学员使用了Flowable。...
  • 解决jar包冲突,修改包名

    千次阅读 2016-06-25 18:17:34
    相信很多人都遇到过导入第三包出现包冲突的问题,eclipse能够报错知晓某个jar有问题,但是as却不行,只会报错,不会提示具体哪个jar包(网上了解到,应该是这样吧,欢迎指教!)。因为项目之前是用Gson解析的,但是...
  • maven隐式依赖引起的包冲突

    千次阅读 2016-09-01 21:01:17
    包冲突 使用maven管理项目时可能会遇到包冲突的情况比如:log4j-over-slf4j.jar 和 slf4j-log4j12.jar这两个包同时一起运行时就会有问题。 这种冲突可能是显式依赖导致,也可能是隐式依赖导致。 显式依赖,直接可以...
  • asm包冲突

    2013-07-01 16:16:46
    这次又是asm包冲突了,出错信息是: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V 查了网上相关的,开始以为...
  • JAR包冲突是JAR开发过程中常遇到的问题,近期一个项目过程中,出现了如下的冲突: org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]与 ch/qos/logback/...
  • spring和jackson包冲突问题

    千次阅读 2017-11-06 16:42:00
    spring和jackson包冲突问题
  • Android 删除aar包中的jar包解决Duplicate class包冲突问题 找到那个aar,解压后删除重复jar包,执行jar cvf after_delete.jar命令重新打包
  • Maven如何解决jar包冲突 什么时jar包冲突 当同一个项目中引入多个相同的jar包,只是它们的版本号不同,即version,而你想使用高版本中的类或者方法,此时低版本的jar包中没有这个方法或者没有这个类,就会抛出 java...
  • 1,因本地依赖的包和服务器上包冲突。主要是是flink集群已经有guava的jar包。错误代码如下: 2020-12-04 23:35:45 java.lang.NoSuchMethodError: com.google.common.hash.Hashing.farmHashFingerprint64()Lcom/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,716
精华内容 8,686
关键字:

包冲突