簡體   English   中英

Maven Java接口和實現多模塊問題

[英]Maven Java interface and implementation multi-module issue

假設我有一個包含 2 個模塊的重用項目:api 和服務。 re-use api 模塊定義了可以被其他應用程序項目使用的接口、類型、注解。 重用服務模塊包含真正的實現。 重用項目如下所示:

pom.xml: id=reuse, group=com.test.project, version=1.0.0
|__api-module
        |__pom.xml: parent={id=reuse, group=com.test.project, version=1.0.0}, id=reuse-api
|__service-module
        |__pom.xml: parent={id=reuse, group=com.test.project, version=1.0.0}, id=reuse-srv

我們的一個應用程序依賴於重用模塊。

pom.xml: id=application, group=com.test.project, version=2.0.0
         dependency={scope=compile, id=reuse-api, group=com.test.project, version=1.0.0}
         dependency={scope=runtime, id=reuse-srv, group=com.test.project, version=1.0.0}

問題是,如果現在我們更改重用服務模塊中的某些內容,這意味着我們更改重用模塊的實現,則必須編譯整個重用模塊(api 和服務),並且新版本將是發布,因為api和服務模塊的版本是從父模塊繼承的。 新的 pom 結構將如下所示:

pom.xml: id=reuse, group=com.test.project, version=1.0.1
|__api-module
        |__pom.xml: parent={id=reuse, group=com.test.project, version=1.0.1}, id=reuse-api
|__service-module
        |__pom.xml: parent={id=reuse, group=com.test.project, version=1.0.1}, id=reuse-srv

之后,應用程序必須使用新版本的重用更改依賴項:

pom.xml: id=application, group=com.test.project, version=2.0.1
         dependency={scope=compile, id=reuse-api, group=com.test.project, version=1.0.1}
         dependency={scope=runtime, id=reuse-srv, group=com.test.project, version=1.0.1}

有沒有辦法使重用服務模塊的修改也不會導致應用程序發生變化? 應用程序真的不需要受到重用實現的變化的影響嗎?

你有什么意見/建議嗎? 謝謝你。

假設您將 2 個模塊存儲在某個工件存儲庫中(例如,您公司中托管的某個存儲庫管理器

service-api-1.0.0
service-impl-1.0.0

這些模塊在多個應用程序之間共享:

app-1
   compile: service-api-1.0.0
   runtime: service-impl-1.0.0
app-2
   compile: service-api-1.0.0
   runtime: service-impl-1.0.0

應用程序應在構建配置中定義您的存儲庫( 附加 Maven 存儲庫)並按版本號引用它們。

每次在 API/實現上完成一組更改時,您都應該發布一個具有更高版本的庫。

庫版本通常由 3 個組件組成[major].[minor].[bugfix]

  • Bugfix時,有沒有新的功能,但只是修復現有功能的版本應該更新每一個版本。
  • 當有向后兼容以前版本的新功能時,會更新Minor版本。
  • 當我們引入不兼容的更改時, Major版本會更改。

例如,在修復service-impl-1.0.0一些實現缺陷時,您正在發布service-impl-1.0.1 這個可能/應該仍然針對service-api-1.0.0編譯。

這個新版本將安裝在您的存儲庫中,然后其內容將是

service-api-1.0.0
service-impl-1.0.0
service-impl-1.0.1

除非您更新應用程序的配置,否則它仍將針對存儲庫中仍然可用的舊版本進行編譯和構建。 所以你現在可以擁有:

app-1
   compile: service-api-1.0.0
   runtime: service-impl-1.0.0
app-2
   compile: service-api-1.0.0
   runtime: service-impl-1.0.1

只要它們可以訪問您的庫的歷史版本,就無需更改每個應用程序。 僅當您想要獲得新功能時才更改依賴項版本(與您對 Maven 中心中的任何其他公共共享庫所做的方式非常相似)。

如果您更改庫的代碼,應用程序有三個選擇:

  1. 使用新版本重新編譯。
  2. 保留舊版本並忽略所做的更改。
  3. 不要再次編譯,而是在運行時使用新庫。

第三個選項有點冒險,因為它要求所有接口和所有行為都保持不變,否則您可能會遇到運行時異常。 不過,這很常見。

如果您真的想將庫的實現與應用程序分離,您需要一種不同類型的依賴項,例如 REST 服務。 在效果上,這類似於(3),因為您更改了 REST 服務的實現,但保證行為和接口不變。

暫無
暫無

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

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