neverend的日志

          不記錄,終將被遺忘。 一萬(wàn)年太久,只爭(zhēng)朝夕。 他們用數(shù)字構(gòu)建了整個(gè)世界。

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            62 Posts :: 1 Stories :: 17 Comments :: 0 Trackbacks
          項(xiàng)目開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)碰到maven依賴沖突的問(wèn)題,這篇post整理下maven依賴沖突產(chǎn)生的原因以及解決方案

          maven依賴沖突的產(chǎn)生是由maven傳遞性依賴造成的:

          什么是maven傳遞依賴?
          “一個(gè)傳遞性依賴就是對(duì)于一個(gè)依賴的依賴。如果project-a依賴于project-b,而后
          者接著依賴于project-c,那么project-c就被認(rèn)為是project-a的傳遞性依賴。如
          果project-c依賴于project-d,那么project-d就也被認(rèn)為是project-a的傳遞性依
          賴。Maven的部分吸引力是由于它能夠管理傳遞性依賴,并且能夠幫助開(kāi)發(fā)者屏蔽掉跟
          蹤所有編譯期和運(yùn)行期依賴的細(xì)節(jié)。你可以只依賴于一些包如Spring Framework,而不
          用擔(dān)心Spring Framework的所有依賴,Maven幫你自動(dòng)管理了,你不用自己去詳細(xì)了解
          配置。
          Maven是怎樣完成這件事情的呢?它建立一個(gè)依賴圖,并且處理一些可能發(fā)生的沖突和
          重疊。例如,如果Maven看到有兩個(gè)項(xiàng)目依賴于同樣的groupId和artifactId,它會(huì)自動(dòng)
          整理出使用哪個(gè)依賴,選擇那個(gè)最新版本的依賴。雖然這聽(tīng)起來(lái)很方便,但在一些邊界
          情況中,傳遞性依賴會(huì)造成一些配置問(wèn)題。在這種情況下,你可以使用依賴排除。”
                                                                       ——摘自《Maven權(quán)威指南》

          什么情況下會(huì)產(chǎn)生依賴沖突?
          舉例說(shuō)明:項(xiàng)目中的pom.xml里聲明了對(duì)project-a1.0與project-b2.0的依賴,而project-a1.0又傳遞依賴于project-b1.0的版本。
          假設(shè)maven經(jīng)過(guò)分析之后決定使用project-b1.0的依賴,也就是打包的時(shí)候把project-b1.0.jar打進(jìn)了war包。
          war包部署在java容器中啟動(dòng)之后,如果依賴project-b2.0.jar中新添的類或方法,就會(huì)發(fā)現(xiàn)引用的類或者方法不存在。
          這種現(xiàn)象就是依賴沖突。

          如何分析依賴沖突?
          mvn dependency:tree

          沖突解決方案:
          使用maven提供的<exclusion>標(biāo)簽。
          舉例說(shuō)明:
          如果你正依賴于一個(gè)類庫(kù),該類庫(kù)又依賴于Sun JTA API,你會(huì)想要替換這個(gè)傳遞性依賴。
          Hibernate是一個(gè)例子。Hibernate依賴于Sun JTA API,而后者在中央Maven倉(cāng)庫(kù)中不可用,因?yàn)樗遣?br />能免費(fèi)分發(fā)的。幸運(yùn)的是,Apache Gernoimo項(xiàng)目創(chuàng)建了一些可以免費(fèi)分發(fā)的獨(dú)立實(shí)現(xiàn)
          類庫(kù)。為了用另外的依賴來(lái)替換這個(gè)傳遞性依賴,你需要排除這個(gè)傳遞性以依賴,然后
          在你的項(xiàng)目中再聲明一個(gè)依賴。下面展示了這樣一個(gè)替換的樣例。
          <dependency>
              
          <groupId>org.hibernate</groupId>
              
          <artifactId>hibernate</artifactId>
              
          <version>3.2.5.ga</version>
              
          <exclusions>
                  
          <exclusion>
                      
          <groupId>javax.transaction</groupId>
                      
          <artifactId>jta</artifactId>
                  
          </exclusion>
              
          </exclusions>
          </dependency>
          <dependency>
              
          <groupId>org.apache.geronimo.specs</groupId>
              
          <artifactId>geronimo-jta_1.1_spec</artifactId>
              
          <version>1.1</version>
          </dependency>


          posted on 2012-02-03 15:51 neverend 閱讀(1972) 評(píng)論(1)  編輯  收藏 所屬分類: 工具技巧

          Feedback

          # re: maven依賴沖突[未登錄](méi) 2014-01-22 14:11 daniel
          恩,總結(jié)的不錯(cuò)。 通過(guò)mvn dependency:tree 找出沖突的依賴包,然后通過(guò)mvn的exclude或者直接引入maven依賴來(lái)解決依賴沖突 http://www.daniel-journey.com/archives/1125  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
          相關(guān)文章:
           
          主站蜘蛛池模板: 临沂市| 南川市| 溆浦县| 潍坊市| 惠安县| 仁寿县| 高要市| 秦皇岛市| 平度市| 泸州市| 万全县| 东乡县| 铜山县| 上栗县| 乌拉特中旗| 孟州市| 民勤县| 铜川市| 涟源市| 会昌县| 宁蒗| 石家庄市| 榆林市| 乌兰县| 汝城县| 阿城市| 青海省| 修武县| 天津市| 连平县| 米脂县| 合肥市| 象州县| 磴口县| 永城市| 广安市| 绵竹市| 綦江县| 凤庆县| 玉树县| 武安市|