簡體   English   中英

管理項目依賴項的最佳方法是什么

[英]What is the best way to manage project dependencies

我在服務中有以下依賴層次結構:

Service A
   -> Lib A
   -> Lib B
      -> Lib A
   -> Lib C
      -> Lib A
    -> Lib D
      -> Lib A

“ - >”的意思取決於。

由於上述結構,出現了很多問題。 需要大部分努力的是使Lib A在所有模塊中保持同步,以避免類沖突和其他問題。

我正在使用maven進行依賴管理但它沒有解決問題,因為我必須更新所有依賴項以避免沖突(語義和功能)

有沒有更好的方法來管理這些依賴項?

編輯1:

場景1 :向Lib A添加新代碼,僅由Lib B使用。

在這種情況下,改變Lib B是不夠的。我將不得不在服務A中添加最新版本的Lib A,以便maven選擇正確的版本。

場景2 :A中的非向后兼容更改

如果我只更新服務A中的Lib A,這將導致問題,因為其他庫(B,C和D)不知道這個新的更改並且它可能會中斷(例如,在現有方法方法中添加新參數)。 我將不得不更新所有這些。

場景3 :更改Lib A中的現有方法

這樣可以正常工作。 如果我在服務A中更新此Lib A,maven將獲取最新的Lib A,並且所有庫(B,C和D)將使用最新版本的Lib A.

不確定我是否理解正確的問題,你是否提到了庫之間的依賴沖突。

如果您在庫之間具有相同的依賴關系,那么將其排序的一種方法可能是使用排除項,這樣您就可以添加一個依賴項並排除其他依賴項( https://maven.apache.org/guides/introduction/introduction-to- optional-and-excludes-dependencies.html

您可以查看OSGi或Java 9模塊(當然還沒有完成)。 我不是專家,但我相信這些框架允許模塊/包的概念,其中每個模塊都有自己的類加載器。 這意味着如果lib B和lib C是模塊,它們可以有不同版本的lib A,一切都會順利進行。 它確實阻止了lib B和lib C直接通信,但是給出了你需要的依賴樹。

- 更新以匹配您的更新 -

場景1:

更新lib僅在模塊B中的版本。模塊C / D可以保持不變。

場景2:

當每個模塊准備好使用新版本的lib A時,您可以單獨更新模塊B / C / D中的庫A.

場景3:

沒有任何問題。

考慮領域驅動設計 ,更具體地說是有界上下文模式 它允許代碼重復到一定程度。 靈活性使您可以非常輕松地將“jar A”與其余部分分離。

什么是有界上下文?

讓我們想象一下,我們有用戶。 在一個上下文中的此用戶可以是UserAdmin,或者在另一個上下文中,它可以是PowerUser,或者在另一個上下文中可以是User

現在讓我們有3個服務的成像,基於hist類型解決用戶的三個不同功能。 每個服務代表用戶一詞的不同上下文。 現在的重點是,不是在你的情況下創建一個全能的“用戶”,它將進入全能的“libA”,我們將根據上下文創建3個用戶,並將為這3個用戶提供不同的功能。 最終我們將最終得到3個域對象AdminUser用於服務1 PowerUser用於服務2而僅用戶用於服務3.這三個服務將不會彼此依賴,除非它適合我們,即使他們擁有它將是小菜一碟在任何時候解耦他們。

如果我們開始將服務想象為洋蔥。 在第一層,我們將有持久性。 在第二層,我們將開始展開我們的域模型。 在下一層,我們將開始構建我們的服務。 然后我們的網絡表示等等。

根據Bounded Context進行思考將允許您基於每個服務創建一個唯一的Bounded上下文,這將允許您在不同的Jars之間不具有這種相互依賴性。 這是因為您的服務不一定與其他服務共享代碼。

Service A
   -> Project Commons
       -> Lib B_A (functional dependency, commons B no functional dependency with C and D)
       -> Lib C_A (functional dependency, commons C no functional dependency with B and D)
       -> Lib D_A (functional dependency, commons C no functional dependency with B and C)
       -> Lib A (technical dependencies , commons in B C D)
       -> pom_parent
   -> Lib B
      -> Lib A and Lib B_A
   -> Lib C
      -> Lib A and Lib C_A
    -> Lib D
      -> Lib A and Lib D_A
pom_parent (SNAPSHOT)

暫無
暫無

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

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