簡體   English   中英

解決 gradle 中的循環依賴

[英]Resolve circular dependency in gradle

我最近開始開發一個 java 項目,其中包含一些子項目。 它們都是 gradle。 因此,假設有兩個項目 A 和 B 已經實施。 我要介紹另一個gradle項目C。 依賴關系是這樣的。

  • A 依賴於 B
  • B 依賴於 C
  • C 依賴於 A

所以我需要在沒有循環依賴錯誤的情況下實現這個項目 C,因為它是在我嘗試使用 gradle 構建項目時給出的。 我看到一些答案,Interface 是一個解決方案。 但在我的情況下,項目 A 和 B 是大型項目,我想不出如何為它們引入接口。 我唯一能做的就是為項目 C 引入接口。 那么有沒有辦法解決我在這些情況下的問題? 如果沒有這樣的方法是什么? 請注意,這些 A、B、C 項目是單獨的項目,因此不能合並為一個項目。

前言

當你的依賴圖中有一個循環時,沒有什么魔法可以讓你編譯你的項目。 您需要進行一些重構以消除循環。

處理循環依賴的方式是將模塊拆分為更小的模塊,然后重復此操作,直到消除循環。

算法

1)首先將C使用的A部分提取到一個單獨的模塊(我們稱之為D):

A -> B -> C
|         |
|         |
 --> D <--

如果 D 不依賴於任何其他模塊,您就完成了。 如果是,則需要繼續拆分。

2)假設D仍然依賴於B:

A -> B -> C
|    ^    |
|    |    |
 --> D <--

您需要從 B 中類比提取公共部分(我們稱之為 E):

A -> B -> C
|    |    |
|    v    |
|    E    |
|    ^    |
|    |    |
 --> D <--

再一次,如果 E 沒有導致循環的依賴項 - 你就完成了。 如果沒有 - 繼續。

3)假設E仍然依賴於C:

A -> B -> C --
|    |    ^   |
|    v    |   |
|    E ---    |
|    ^        |
|    |        |
 --> D <------

我們做什么? 明顯拆分 C(提取 F):

A -> B -> C --
|    |    |   |
|    v    v   |
|    E -> F   |
|    ^        |
|    |        |
 --> D <------

后記

請注意,如果完全可行(在合理的時間和/或預算內),它可能並不那么容易,因此考慮到上下文,最好只復制 C 所依賴的 A 中的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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