[英]Maven dependency resolution (conflicted)
假設我有四個項目:
在這種情況下,如果我運行項目A,Maven將正確解析對D的依賴。如果我理解正確,Maven總是采用最短路徑的依賴。 由於D是A的直接依賴,因此將使用它而不是在B中指定的D.
但現在假設這個結構:
在這種情況下,解析D的路徑具有相同的深度。 發生的事情是Maven會發生沖突。 我知道有可能告訴Maven他應該排除依賴關系。 但我的問題是如何解決這類問題。 我的意思是在現實世界的應用程序中,你有很多依賴,也可能有很多沖突。
最佳實踐解決方案是真的排除東西還是有其他可能的解決方案? 當我突然得到ClassNotFound Exception時,我發現很難處理,因為某些版本已經改變,這導致Maven采取不同的依賴。 知道這一事實的原因使得更容易猜測問題是依賴性沖突。
我正在使用maven 2.1-SNAPSHOT。
解決這種情況的主要方法是在項目的根pom中包含一個<dependencyManagement>
部分,您可以在其中指定將使用哪個庫的版本。
編輯:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</dependencyManagement>
現在無論哪個版本的庫foo:bar都是依賴項請求,版本1.2.3將始終用於此項目和所有子項目。
參考:
Maven可以處理這兩種情況而不會發生沖突。 當需要兩個版本的傳遞依賴時,將存在沖突。 您描述的ClassNotFoundException
來自app(或依賴項),它試圖使用實際使用的沖突依賴項版本中不可用的類。 有多種方法可以解決問題。
<dependencyManagement>
部分指定傳遞依賴項應使用的沖突依賴項的版本 <exclusion>
明確排除沖突依賴項的不需要版本與依賴它們的依賴項一起包含 這基本上不是maven問題,而是java問題。 如果項目B和項目C需要兩個不兼容的項目D版本,那么您不能在項目A中使用它們。
不幸的是,正如您所知,Maven解決這些沖突的方法是選擇排除哪些沖突。
使用mvn dependency:analyze
和mvn dependency:tree
有助於找到你遇到的沖突。
您可以使用規則依賴性收斂在整個項目中強制實施一致的依賴關系 。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.3.1</version>
<executions>
<execution>
<id>enforce</id>
<configuration>
<rules>
<DependencyConvergence/>
</rules>
</configuration>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
</plugin>
一種可能的策略是為主項目指定要使用的D版本(最新的一個fg)。 但是,如果庫D不向后兼容,則存在kukudas所述的問題 - 在項目中不可能同時使用這兩個庫。
在這種情況下,可能需要在舊版本中使用B或C,因此兩者都將取決於D的兼容版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.