2017-03-16 47 views
1

我有一個maven的問題。我有一個巨大的多模塊項目,改變其結構的可能性有限。Maven中的循環依賴和項目的可怕結構

所以,假設我有3個模塊:A,B,C。

  • A是B和C的父
  • C使用從類B,所以我們有乙在C的POM文件的依賴關係。
  • B不需要將C作爲依賴項來成功編譯。

現在,沒有任何問題。

不幸的是,B在運行時(spring,ioc,...)中使用了C,所以有人將C添加爲B的依賴項,所以我們在Maven中有一個可怕的循環。建立完成失敗(類似「檢測到週期」在日誌中)。我想用這種方式保持它(在B模塊中提供某種程度上的C依賴性),因爲我需要使用所有需要的JAR壓縮文件(包括來自C的JAR)來編譯和傳遞B。

我可以以某種方式構建C並在全面編譯B之後將它的JAR複製到B的目標目錄中嗎?有沒有插件或工具可以由maven用來做到這一點?

如果這篇文章不清楚,我會試着更詳細地描述它。

在此先感謝;)

+0

創建D.移動的依賴關係D.使B和C取決於D. –

+0

謝謝你,這聽起來很不錯。不幸的是,該項目有多個模塊,恐怕我不能改變它的結構。有沒有辦法解決我的問題,而無需重新組織整個項目的結構? – KP13

+0

Maven是一個自動化的構建工具。您建議手動黑客構建過程。這不是解決方案。 –

回答

0

這是我該怎麼做。從C的POM文件:

<profile> 
    <id>compile</id> 
     <dependencies> 
     <dependency> 
      use B here but do not use in the main dependencies section 
     </dependency> 
      + other dependencies 
     </dependencies> 
    </build> 
</profile> 

例如,你可以編譯用C模塊mvn compile -Pcompile

從B的POM文件:

<profile> 
    <id>run</id> 
     <dependencies> 
     <dependency> 
      use C here but do not use in the main dependencies section 
     </dependency> 
      + other dependencies 
     </dependencies> 
    </build> 
</profile> 

運行使用mvn yourcommandforrunning -Prun

B模塊通過這種方式你可以逃避循環依賴問題。

0

聽起來好像有兩個問題:

  1. 如何告訴Maven的有關文物之間的僅運行時依賴。
  2. 如何讓Maven利用依賴將所有相關的依賴集中在一起。

Maven具有依賴管理功能,可以使用依賴項元素的「範圍」元素通知maven這些細微差別。在這種情況下,我想你想

<scope>runtime</scope> 

查看documentation。特別是:

運行時 - 此範圍指示編譯時不需要依賴項,但是用於執行。它在運行時和測試類路徑中,但不在編譯類路徑中。

正確利用運行時間scope應解決循環依賴性問題。

關於第二個問題,你有沒有提供足夠的信息,以提供一個明確的答案。但是,您幾乎可以肯定地想要使用Maven插件來利用Maven有關依賴關係的信息。例如,如果您想生成一個包含所有內容的單個「胖」jar文件,您需要查看maven-shade-plugin。另一個選項是maven-assembly-plugin,它非常靈活,並且可以包含程序集中的所有依賴項。還有其他插件擅長處理各種其他常見情況。如果您在使用特定插件時遇到問題,您可能需要制定一個單獨的問題。