[英]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 中心中的任何其他公共共享庫所做的方式非常相似)。
如果您更改庫的代碼,應用程序有三個選擇:
第三個選項有點冒險,因為它要求所有接口和所有行為都保持不變,否則您可能會遇到運行時異常。 不過,這很常見。
如果您真的想將庫的實現與應用程序分離,您需要一種不同類型的依賴項,例如 REST 服務。 在效果上,這類似於(3),因為您更改了 REST 服務的實現,但保證行為和接口不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.