簡體   English   中英

Maven依賴解析(沖突)

[英]Maven dependency resolution (conflicted)

假設我有四個項目:

  • 項目A(依賴於B和D)
  • 項目B(依賴於D)
  • 項目C(依賴於D)
  • 項目D.

在這種情況下,如果我運行項目A,Maven將正確解析對D的依賴。如果我理解正確,Maven總是采用最短路徑的依賴。 由於D是A的直接依賴,因此將使用它而不是在B中指定的D.

但現在假設這個結構:

  • 項目A(依賴於B和C)
  • 項目B(依賴於D)
  • 項目C(依賴於D)
  • 項目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(或依賴項),它試圖使用實際使用的沖突依賴項版本中不可用的類。 有多種方法可以解決問題。

  1. 根據沖突的依賴關系更新正在使用的庫的版本,以便它們都依賴於該依賴項的相同版本版本
  2. 將沖突的依賴項聲明為項目與要包含的版本的直接依賴關系(在示例中,包含缺少的類的那個)
  3. 通過POM的<dependencyManagement>部分指定傳遞依賴項應使用的沖突依賴項的版本
  4. 使用<exclusion>明確排除沖突依賴項的不需要版本與依賴它們的依賴項一起包含

這基本上不是maven問題,而是java問題。 如果項目B和項目C需要兩個不兼容的項目D版本,那么您不能在項目A中使用它們。

不幸的是,正如您所知,Maven解決這些沖突的方法是選擇排除哪些沖突。

使用mvn dependency:analyzemvn 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM