解决Maven包依赖冲突导致IDEA中Maven报红色警告线(omitted for conflict with...)问题

  1. 情景再现:
    今天工作时用IDEA从svn上down个项目,完成后点击重新导入所有maven项目后,maven报了红色警告线错误,如图:
    解决Maven包依赖冲突导致IDEA中Maven报红色警告线(omitted for conflict with...)问题_第1张图片
    最终的错误信息为:“omitted for conflict with 1.1”。大致意思是这个javax.activation:activation:1.02版本与1.1版本存在依赖冲突。

  2. 原因分析:
    平时对maven不是特别了解,在一番搜索学习后,大致明白了其中的问题所在:
    出现版本冲突的原因是因为由于Maven具有依赖传递性,所以当你引入一个依赖类的同时,其身后的依赖类也一起如过江之鲫纷至沓来了

    举个例子:
      A依赖于B及C,而B又依赖于X、Y,而C依赖于X、M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过等若干种方式控制传递依赖)。
      这里有一个需要特别注意的,即B和C同时依赖于X,假设B依赖于X的1.0版本,而C依赖于X的2.0版本,A究竟依赖于X的1.0还是2.0版本呢? 这就看Classloader的加载顺序了,假设Classloader先加载X_1.0,而它就不会再加载X_2.0了,如果A恰恰希望使用X_2.0呢,血案就这样不期而遇了。就会出现了“omitted for conflict with…”依赖版本冲突的问题。

  3. 解决方法:
    解决依赖版本冲突的方法其实很简单,将不想要或低版本的传递依赖去除掉即可
    比如我这个项目的maven依赖中错误如图中显示的已经很明确了,同时存在两个不同版本的依赖类“javax.activation:activation:1.1”与“javax.activation:activation:1.02”,由依赖关系可以看出,二者都是由依赖“org.codehaus.xfire:xfire-all:1.2.6”引入的,那么我们pom.xml文件中找到这个依赖,加入如下配置项代码,将低版本的传递依赖包去除掉就ok了。

    
            org.codehaus.xfire
            xfire-all
            1.2.6
            
            
                
                    javax.activation
                    activation
                    1.0.2
                
            
        
    

    去除掉后刷新maven即可,如图,红色警告线消失,低版本依赖灰飞烟灭~
    解决Maven包依赖冲突导致IDEA中Maven报红色警告线(omitted for conflict with...)问题_第2张图片


后记:
搜索资料时在网上看到关于maven的一段话,觉得很有意思,记录下来:

如果你爱他,就请让他用Maven,因为那里是天堂,
如果你恨他,就请让他用Maven,因为那里是地狱。
Maven对于新手来说是《步步惊心》,因为它包罗万象,博大精深,当你初来乍到时,你就像一个进入森林的陌生访客一样迷茫。
Maven对于老手来说是《真爱配方》,因为它无所不能,利如刀锋,使用Maven做开发,如饮美酒如悦美人。

我要好好学习了解一下Maven,以后使用Maven开发时,饮美酒、悦美人,哈哈哈 ^_^。

你可能感兴趣的:(Maven)