2017-10-19 46 views
2

假設我有一個包含2個模塊的重用項目:API和服務。重用api模塊定義了其他應用程序項目可以使用的接口,類型和註釋。重用服務模塊包含真正的實現。重複使用項目如下所示:Maven Java接口和實現多模塊問題

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} 

有沒有一種方式的修改重新使用服務模塊也不會導致應用程序發生變化?應用程序並不需要受到重用實現更改的影響,或者?

您有任何意見/建議嗎?謝謝。

+0

如果不更改,爲什麼要更改API的版本? –

+0

無需更改api的版本。如果您還使用類似於Spring的框架,請配置您的bean並使用服務定位器將bean的實例獲取到需要的地方。 – alainlompo

回答

1

讓我們假設你有存儲在某些神器庫(例如一些repository manager在貴公司託管)

service-api-1.0.0 
service-impl-1.0.0 

有模塊在多個應用程序之間共享你的2個模塊:

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 

的應用程序應該在構建配置中定義您的存儲庫(additional maven repository)並通過版本號引用它們。

每當您完成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 central中任何其他公共共享庫的處理方式一樣)。

1

如果你改變你的庫的代碼時,應用程序可以有三種選擇:

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

第三個選項有點危險,因爲它需要所有的接口和所有的行爲不變,否則你可能會得到運行時異常。不過,這很常見。

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