2009-05-20 49 views
2

我正在編寫一個將以幾種不同版本發佈的應用程序(最初大約10個變體的代碼庫將存在,並且需要維護)。當然,98%左右的代碼在不同的系統中是相同的,並且保持代碼基礎完好無損。Java - 保持分割代碼庫的多版本應用程序

我的問題是 - 什麼是這樣做的首選方法?如果我有一個類(MyClass),在某些版本(MyClassDifferent)中有所不同,並且該類在幾個位置被引用。我希望該引用可以根據我正在編譯的應用程序的版本進行更改,而不必將所有引用MyClassDifferent的類分開。預處理宏會很好,但是它們膨脹了代碼並且afaik只有可用的概念實現的證明?

我正在考慮像工廠模式,加上每個應用程序的配置文件。有沒有人有任何提示或指針?

+0

爲什麼社區wiki? – dfa 2009-05-20 08:11:02

回答

1

查找AbstractFactory設計模式「依賴注入」和「控制反轉」。馬丁福勒寫道這些here

簡而言之,您將帶有所有必需組件的JAR文件。對於可以自定義的每個服務點,您可以爲該服務定義一個接口。然後你編寫一個或多個該接口的實現。要創建一個服務對象,你問一個AbstractFactory它,比如:

AbstractFactory factory = new AbstractFactory(); 
... 
ServiceXYZ s = factory.newServiceXYZ(); 
s.doThis(); 
s.doThat(); 

裏面你AbstractFactory使用Java反射法Class.classForName(你建立適當的ServiceXYZ對象),以及SomeClassObject.newInstance()。 (這樣做意味着除非有意義,否則不必在jar文件中包含ServiceXYZ類,也可以正常構建對象。)

實際的類名是從每個站點特有的屬性文件讀入的。

您可以輕鬆地推出自己的解決方案,或者使用框架,如SpringGuicePico

4

你是在正確的軌道上:工廠模式,配置等

你也可以把系統在不同的jar文件的特定功能,然後你只需要包括相應的罐子旁邊的核心jar文件。

2

我想第二個工廠的方法,你應該仔細看看maven或ant(取決於你使用的是什麼)。 您可以根據參數/配置文件部署確定使用哪些類的不同配置文件。

像C/C++這樣的預處理器makros不能直接用於java。雖然也許可以通過構建腳本來模擬這個。但我不會走這條路。我的建議是堅持工廠的方法。

2

幸好你有幾種選擇

1)ServiceLoader(內置在的Java6)放像MyClass的你的API類在一個罐子裏,在編譯你對這個API的應用程序。然後將一個單獨的MyClass實現放在一個單獨的jar文件中,並使用/META-INF/services/com.foo.MyClass。 。然後,您可以維護幾個版本的應用程序,只需保留一個「發佈」的罐子。你的 「主」 類只是一堆的ServiceLoader的要求

2)的1相同的架構),但是與Spring或Guice的配置

3)OSGI

4)解決方案替換META-INF服務