1. 程式人生 > >解決Maven包依賴衝突導致IDEA中Maven報紅色警告線(omitted for conflict with...)問題

解決Maven包依賴衝突導致IDEA中Maven報紅色警告線(omitted for conflict with...)問題

  1. 情景再現:
    今天工作時用IDEA從svn上down個專案,完成後點選重新匯入所有maven專案後,maven報了紅色警告線錯誤,如圖:
    在這裡插入圖片描述
    最終的錯誤資訊為:“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可通過<scope>等若干種方式控制傳遞依賴)。
      這裡有一個需要特別注意的,即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了。

    <dependency>
            <groupId>org.codehaus.xfire</groupId>
            <artifactId>xfire-all</artifactId>
            <version>1.2.6</version>
            <!-- 去除版本不一致的傳遞依賴包 -->
            <exclusions>
                <exclusion>
                    <groupId>javax.activation</groupId>
                    <artifactId>activation</artifactId>
                    <version>1.0.2</version>
                </exclusion>
            </exclusions>
        </dependency>
    

    去除掉後重新整理maven即可,如圖,紅色警告線消失,低版本依賴灰飛煙滅~
    在這裡插入圖片描述


後記:
搜尋資料時在網上看到關於maven的一段話,覺得很有意思,記錄下來:

如果你愛他,就請讓他用Maven,因為那裡是天堂,
如果你恨他,就請讓他用Maven,因為那裡是地獄。
Maven對於新手來說是《步步驚心》,因為它包羅永珍,博大精深,當你初來乍到時,你就像一個進入森林的陌生訪客一樣迷茫。
Maven對於老手來說是《真愛配方》,因為它無所不能,利如刀鋒,使用Maven做開發,如飲美酒如悅美人。

我要好好學習瞭解一下Maven,以後使用Maven開發時,飲美酒、悅美人,哈哈哈 ^_^。