精华内容
下载资源
问答
  • 然而,过多复杂的jar包依赖就可能造成版本冲突问题。比如:项目依赖A和B;A依赖C1.0,B依赖C2.0,如果C的两个版本不兼容,我们的项目就会出现问题。像例子中这样的C在还是很多的,最常见的就属apache的...

    Java的强大之处就是在于它的生态环境,有众多的轮子支持复杂项目的开发。现在基本上每个稍微有点规模的Java项目都会依赖到众多的jar包,而Maven应该是目前管理jar包依赖最流行的工具。然而,过多复杂的jar包依赖就可能造成版本冲突问题。比如:

    项目依赖A和B;A依赖C1.0,B依赖C2.0,如果C的两个版本不兼容,我们的项目就会出现问题。

    像例子中这样的C在还是很多的,最常见的就属apache的一堆工具包,比如commons-logging;

    冲突解决方法:

    1 分析冲突的jar包的依赖路径

    mvn dependency:tree -Dverbose -Dincludes=commons-logging:commons-loggging

    这条命令可以打印出所有依赖了groupId和artifactId都为commons-logging的jar包的依赖路径。

    2 选择一个所需的版本

    在两个冲突的版本中,我们在自己的项目中用到了哪个版本的语法,就选择哪个。

    3 在本项目的pom中将冲突的依赖排除:

    具体写法:

    比如我们要将一个依赖中的相应的jar包排除:

    Java

    com.xxx.xx

    xxx

    x

    com.springsource.slf4j.org.apache.commons.logging

    org.slf4j

    最后推荐一下intellij,在intellij中打开你的pom.xml,右键单击内容,选择diagram->show dependencies, 会自动执行mvn:dependency 并绘制一个依赖树,列出所有的依赖包如下图所示。想要排除哪个,可以直接右键选择"exclude".不过目前我还没发现怎样像命令行一样过滤树的结果,所有如果依赖太多,还是先执行一下命令找出哪里的依赖冲突了比较好。

    ![dependency.jpg](http://upload-images.jianshu.io/upload_images/1713176-1b64d1abc8bd6ebd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    展开全文
  • Maven中的传递性依赖机制,一方面简化了依赖声明,另一方面如果传递依赖有可能引发版本冲突。例如:有这样的依赖关系:a->b->c->x(1.0)、a->d->x(2.0),对于这样的冲突Maven给出的方案是:第一原则...

    1、为何会产生依赖冲突

      Maven中的传递性依赖机制,一方面简化了依赖声明,另一方面如果传递依赖有可能引发版本冲突。例如:有这样的依赖关系:a->b->c->x(1.0)、a->d->x(2.0),对于这样的冲突Maven给出的方案是:第一原则:路径最近者优先,第二原则:在路径长度相等的前提下,pom中的依赖声明的顺序决定了谁会被解析。

    2、如何排除依赖

      pom如下:

      

    <dependency>
        ......
        <exclusions>
            <exclusion>
                ......
            </exclusion>
        </exclusions>        
    </dependency>
    

    3、优化依赖

    3.1 相关mvn命令

      mvn dependency:list 

      mvn dependency:tree

      mvn dependency:analyze

    3.2 Idea优化支持

     

    转载于:https://www.cnblogs.com/larobyo/p/7479842.html

    展开全文
  • maven 依赖jar包时版本冲突的解决: mvn dependency:tree -Dverbose image.png四种解决方式:1...2、路径近者优先:直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar...

    maven 依赖jar包时版本冲突的解决: mvn dependency:tree -Dverbose

    image.png

    四种解决方式:

    1、第一声明优先原则:

    在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。

    所以,先声明自己要用的版本的jar包即可。

    2、路径近者优先:

    直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。

    3、排出原则:

    传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解决冲突。

    例子:

    org.apache.struts

    struts2-spring-plugin

    2.3.24

    org.springframework

    spring-beans

    4、版本锁定原则(最常使用)

    在配置文件pom.xml中先声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖。解决了依赖冲突。

    例子:

    4.2.4.RELEASE

    5.0.7.Final

    2.3.24

    org.springframework

    spring-context

    ${spring.version}

    IntelliJ IDEA Maven 组件界面

    image.png

    如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有:

    第一个按钮:Reimport All Maven Projects 表示根据 pom.xml 重新载入项目。一般单我们在 pom.xml 添加了依赖包或是插件的时候,发现标注 4 的依赖区中没有看到最新写的依赖的话,可以尝试点击此按钮进行项目的重新载入。

    第六个按钮:Execute Maven Goal 弹出可执行的 Maven 命令的输入框。有些情况下我们需要通过书写某些执行命令来构建项目,就可以通过此按钮。

    第九个按钮:Show Dependencies 显示项目依赖的结构图,可以方便我们直观项目的依赖包情况。这个功能有些具体的操作下面会专门进行讲解。

    如上图标注 2 所示,常用的 Maven 生命周期的命令,通过双击对应的命令来执行项目编译、打包、部署等操作。

    如上图标注 3 所示,为我们在 pom.xml 中配置的插件列表,方便调用插件。

    如上图标注 4 所示,为我们在 pom.xml 中配置的依赖包列表。

    如上图标注 5 所示,为常见的 Java Web 在 Maven 下的一个项目结构。

    大致了解过后,看怎么查看所有jar包的依赖关系。

    image.png

    image.png

    图中的红色实线就算是冲突的,可以右键,排除,就自动在pom文件里面exclude。

    展开全文
  • 第一步判断jar是否加载,还是 加载的jar由于maven依赖管理存在传递依赖,造成依赖的jar版本号不对,相应的类找不到,或者是相应类版本不对,没有对应的方法。一 造成jar 冲突的原因:如果项目中存在对同一jar不同版本...

    项目中,经常会遇到ClassNotFound,NoSuchMethod异常,第一反应往往是类路径不对,jar没有正确的引用。第一步判断jar是否加载,还是 加载的jar由于maven依赖管理存在传递依赖,造成依赖的jar版本号不对,相应的类找不到,或者是相应类版本不对,没有对应的方法。

    一 造成jar 冲突的原因:如果项目中存在对同一jar不同版本依赖的时候,maven 2根据最近原则,默认引用最靠近项目版本的jar,maven 2.0.9会根据最先声明原则 来引用相应版本的jar;无论那种方式,都会出现jar包冲突。在这里提一下gradle依赖,会依赖最新版本的jar。

    二 判断jar是否正确的被引用 有两种方法:

    1在项目启动时加上VM参数:-verbose:class

    项目启动的时候会把所有加载的jar都打印出来 类似如下的信息:

    classpath加载的jar

    -classpath /home/yao/tool/jdk1.8.0_25/jre/lib/jce.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/resources.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/management-agent.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/jfxswt.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/plugin.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/javaws.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/charsets.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/jsse.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/deploy.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/jfr.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/ext/localedata.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/ext/nashorn.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/ext/jfxrt.jar:

    /home/yao/tool/jdk1.8.0_25/jre/lib/ext/sunjce_provider.jar:

    ...............等等

    具体load的类

    [Loaded java.lang.Object from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

    [Loaded java.io.Serializable from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

    [Loaded java.lang.Comparable from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

    [Loaded java.lang.CharSequence from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

    [Loaded java.lang.String from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

    [Loaded java.lang.reflect.AnnotatedElement from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

    [Loaded java.lang.reflect.GenericDeclaration from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

    [Loaded java.lang.reflect.Type from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

    [Loaded java.lang.Class from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]

    ..................等等

    我们可以通过上面的信息查找对应的jar是否正确的被依赖,具体类加载情况,同时可以看到版本号,确定是否由于依赖冲突造成的jar引用不正确;

    2 通过maven自带的工具:‍‍mvn dependency:tree

    具体后面可以加 -Dverbose 参数 ,详细参数可以去自己搜,这里不详细介绍。

    比如分析如下POM

    运行: mvn dependency:tree -Dverbose

    org.apache.poi

    poi

    3.2-FINAL

    commons-beanutils

    commons-beanutils

    1.7.0

    输出结果:

    [INFO] ------------------------------------------------------------------------

    [INFO]

    [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Dependency ---

    [INFO] com.yao:Dependency:pom:1.0-SNAPSHOT

    [INFO] +- org.apache.poi:poi:jar:3.2-FINAL:compile

    [INFO] | +- commons-logging:commons-logging:jar:1.1:compile

    [INFO] | | \- log4j:log4j:jar:1.2.13:compile

    [INFO] | \- (log4j:log4j:jar:1.2.13:compile - scope updated from runtime; omitted for duplicate)

    [INFO] \- commons-beanutils:commons-beanutils:jar:1.7.0:compile

    [INFO] \- (commons-logging:commons-logging:jar:1.0.3:compile - omitted for conflict with 1.1)

    [INFO] ------------------------------------------------------------------------

    通过里面的信息可以看到 两个jar都commons-logging存在依赖,但是版本不同。里面的详细信息显示引用了 commons-logging:commons-logging:jar:1.1 去掉了commons-logging:commons-logging:jar:1.0.3 (omitted for duplicate)。

    通过以上方法我们可以看到项目中引用jar版本号;接下来就是如何排除掉我们不想要版本的jar;

    三 通过Idea intellij 中的Show Dependencies的工具去除重复的jar

    在Pom.xml文件上右击 选择 Diagrams -> Show Dependencies 即可查看Pom的依赖图,通过图可以很容易的看到依赖冲突的jar,exculude掉不想要的版本jar即可。

    展开全文
  • maven 依赖 jar 版本冲突的解决方案 通过 exclusion 标签排除掉不需要的 jar
  • maven 依赖jar包时版本冲突的解决: mvn dependency:tree -Dverboseimage.png四种解决方式:...2、路径近者优先:直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,...
  • maven依赖jar包冲突的解决思路

    万次阅读 2020-04-08 15:18:17
    目的是提供maven依赖jar包冲突的解决思路 需求场景: jackson-databind、fastjson 高危远程代码执行漏洞修复。Jackson-databind,版本号升级为2.10.3;fastjson,版本号升级为1.2.66 问题描述: 对需求...
  • 直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。 排除原则 传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解决冲突。 如: &...
  • maven依赖jar包版本冲突解决方案

    千次阅读 2020-06-30 16:26:51
    jar包版本是以groupId+artifactId为坐标的,在groupId+artifactId相同的情况下version不同代码不同的版本,一般都是version的不同导致的jar冲突。 同一个产品除非是大版本的升级,否则groupId+artifactId一般不会变...
  • maven 依赖jar包版本冲突的解决: mvn dependency:tree -Dverbose image.png 四种解决方式: 1、第一声明优先原则: 在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。 所以...
  • Eclipse maven 解决jar包版本冲突

    万次阅读 2018-05-24 14:20:56
    jessezeng解决maven依赖传递中的版本冲突问题通常情况下,我们都比较喜欢使用maven进行项目管理,要加个依赖包也非常简单,不需要到处去下载jar包,当然除了maven之外,也还有一些非常不错的工具。在使用maven进行...
  • MAVEN项目运行中如果报如下错误:Causedby:java.lang.NoSuchMethodError,Caused by: java.lang.ClassNotFoundException十有八九是Maven jar包冲突造成的。当我们需要A的依赖的时候,就会在pom.xml中引入A的jar包;...
  • maven排查jar包版本冲突

    千次阅读 2017-10-20 14:43:56
    场景描述有时候在pom中引入了新的jar包,由于maven会根据传递依赖,将该jar包依赖的其他jar包自动下载。因此,自动下载的jar包和已存在的jar包可能存在相同的jar包,但是版本不一致。此处就造成了冲突排查方法1、在...
  •  很多情况下jar包会通过依赖传递或者是从父pom中继承而引进来,稍不注意,可能会出现引用的jar包版本不一致的问题,这个时候就会导致上述问题的出现。如下是一般的处理方式: 相同jar包的不同版本:使用exc...
  • A依赖于B及C,而B又依赖于X、Y,而C依赖于X、M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过等若干种方式控制传递依赖)。  这里有一个需要特别注意的,即B和C同时依赖于X,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 598
精华内容 239
关键字:

maven依赖jar包版本冲突