2010-03-22 116 views
0

我打算用現有的代碼庫在Java中創建一個軟件的3個版本。最佳做法是什麼?我應該爲每個版本創建3個不同的項目嗎?還有用於管理版本的任何工具?管理軟件版本

+0

它是什麼類型的應用程序?這是一個桌面應用程序,Web應用程序,本地可安裝的Intranet應用程序嗎?你可以提供的細節越多,答案就越好。 – 2010-03-22 22:27:24

+0

這是一個Java應用程序,可以基於網絡或獨立(較輕版本)。在tomcat上運行(在基於web的版本中),需要一個數據庫 – user121196 2010-03-23 00:27:13

回答

1

我首先想到的是保持一個單一的代碼庫,如果可能的話,用某種標誌的切換。

如果不可能,我會盡量保持儘可能相同,並具有較大的項目中使用更小的項目作爲子項目,如果可能的話自動啓用某些功能 - 例如,每個項目可以有它自己的主要,不同的版本可能只是調用不同的主要設置標誌來啓用功能。

如果你的標誌是最終的,應該連拉避免不必要的代碼到您的項目在所有。

最後,最壞的情況下,在顛覆3個分支。

編輯:

你讓我覺得多一點關於這個,我想我找到了一個更好的解決方案。

我想我這個分成四個項目,結合所有的「共同」的東西變成一個基地項目,這是不同的東西,我會攤開其他三個項目 - 讓我們說你有基地,示範,支付和業務項目..

其中三個可能有所不同,你將有一個對象從演示/薪酬/業務類中的一個提供的功能。例如,如果付費版本具有新的菜單項,則可能在您的某個對象中包含getMenuItems。它會返回一個菜單樹,你可以放在你的菜單欄中。演示版本將有更少的項目。

通過這種方式,您的「Base」永遠不會知道它運行的是哪個版本,它只是使用對象。

爲了獲得對象,我會有一個工廠。工廠會是這個樣子:

private String[] availablePackages={"business", "pay", "demo"}; 

public getMenuClass() { 
    Class c; 
    for(String package : availablePackages) { 
     try { 
      c=Class.forName("com.meh.myapp."+package+".MenuClass"); 
     } catch... { 
      // No package by that name 
     } 
     if(c != null) { 
      return c.newInstance(); 
     } 
    } 
    // Something went wrong, no instance found. 

的上升氣流是,你應該首先嚐試實例c​​om.meh.myapp.business.MenuClass,然後再嘗試......終於pay.MenuClass ... demo.MenuClass 。

這應該允許您通過簡單地運送不同的罐子來改變您的配置 - 如果您決定只運送演示和主罐子,您將獲得一個演示應用程序。通過運送付款jar,您將獲得付費應用程序。

請注意,很可能您希望企業將其大部分工作委託給「支付」,並且「支付」委託其中一部分工作以「演示」,但演示不知道任何業務或支付,而「主」只能反映其他三個。

這將是一個很好的解決方案,因爲沒有配置要求 - 事實上,你只需要運送支付jar從演示升級到支付,主要和演示罐被重用並保持正確的位置是。

+0

你有沒有任何指向java編譯最終標誌的鏈接?一個快速搜索沒有給我很多信息。它如何丟棄未使用的代碼? – user121196 2010-03-23 00:38:55

+0

我的意思是不是一個編譯標誌,我的意思是如果你有一個最終的變量,比如「private final boolean INCLUDE_CODE = false」,那麼它的任何保護,例如:「if(INCLUDE_CODE)myVar = new SpecialClass() ;」應該永遠不會編譯進代碼。它應該認識到,它永遠不會是真實的,並優化它。如果這是SpecialClass被引用的唯一地方,那麼SpecialClass不應該被拉進你的項目 - 但我可能已經想出了一個更好的解決方案,重新閱讀我的答案。 – 2010-03-23 01:25:51

0

理想的方法是將你的應用分爲「核心」,「額外的東西」,「更多的東西」,並結合這些依賴關係。不過,這可能會有很多工作,具體取決於您擁有的代碼庫。

如果您使用SVN進行源代碼管理,您可以從現有代碼庫中爲每個版本創建3個分支。通常人們試圖避免這種情況,例如,如果您需要修復這些分支中的常見錯誤,則需要在其中一個分支中修復該錯誤,然後將其合併到其餘分支中。也許其他源代碼庫更好地處理這種情況,但對於SVN,我想這是唯一的方法。

至於管理版本,我們使用maven。如果你採用「核心」,「額外的東西」,「更多的東西」的方法,maven可以提供幫助,因爲它可以很好地跟蹤每個組件的版本(使用pom)。

編輯:比爾的建議可能是最實際的。如果你使用最後的標誌,那麼編譯器應該拋出無法訪問的代碼。