2009-09-24 110 views
3

我們的應用程序需要支持1.5和1.6的JVM。 1.5支持需要避開1.6 JRE依賴關係,而1.6支持需要利用1.6-only特性。多JRE版本支持的最佳開發實踐是什麼?

當我們將Eclipse項目更改爲使用1.5 JRE時,我們將所有依賴項標記爲錯誤。這對於查看依賴關係的位置很有用,但對簡單開發沒有用處。提交這樣的編譯錯誤的源也感覺不對。

這種多JRE版本支持的最佳做法是什麼?

在C語言中,我們有#ifdef編譯器指令來相當乾淨地解決這些問題。什麼是最清潔的Java等價物?

+0

你如何設法建立你的1.5版本?你是否仔細排除了構建文件中的1.6依賴的東西? – auramo 2009-09-24 11:20:59

回答

3

如果您的軟件必須同時在JRE 1.5和1.6上運行,那麼您爲什麼不僅僅開發1.5版本?是否有理由爲什麼您絕對需要使用僅在Java 6中可用的功能?是否沒有在Java 1.5上運行的第三方庫包含您想要使用的僅支持1.6的功能的等效項?

保持兩個代碼庫,使它們保持同步等是很多工作,並且可能不值得您獲得的成果。因爲Java沒有預處理器,所以你不能像使用預處理器指令那樣(很容易)在C中做這樣的條件編譯。

這取決於課程的規模,但我會說:不要這樣做,只使用Java 5特性,如果您認爲需要Java 6特定的東西,在Java 5上運行的第三方庫可以實現這些功能(甚至可以自己編寫它 - 從長遠來看,這可能比嘗試維護兩個代碼庫的工作更少)。

+0

正是我要說的。僅針對1.5開發,不要使用任何棄用的API或功能。 – cletus 2009-09-24 12:08:58

+1

1.6中沒有什麼用處? – 2009-09-24 13:03:42

+1

湯姆,這是一個單獨的問題,不是嗎?如果他們的應用程序沒有使用特定於1.6的任何東西,那麼他們可以通過瞄準1.5來節省大量時間。 – 2009-09-24 13:34:57

1

有幾個方法,你可以使用:

  • 編譯爲1.6,並使用測試,以確保功能緩慢下降;這是我在商業產品(1.3兼容性1.4目標)上合作的一個流程
  • 使用特定於版本的插件並使用運行時確定要加載的內容;這需要某種插件框架
  • 針對1.5編譯並使用反射來調用1.6功能;我會避免因爲過度的性能降低

在所有的情況下,第一種方法增加了複雜性這一點,你要隔離功能,確保生成的類文件有version of 49.0(用1.5目標編譯) 。初始化外觀類時,可以使用反射來確定方法/功能的可用性。

2

將大部分代碼編譯爲1.5。爲1.6特定的代碼有一個單獨的源代碼目錄。 1.6來源應該取決於1.5,但反之亦然。接口1.6代碼應該通過從1.5代碼中分類類型來完成。 1.5代碼可能有替代實現,而不是每個地方都檢查null

使用一次反射來嘗試加載根1.6類的實例。在創建一個實例之前,根類應該檢查它是否運行在1.6之上(我建議在靜態初始化程序中使用-target 1.6`和僅使用1.6的方法)。

0

如果它很容易分支(git,svn或Perforce會很好),你可以使用你的源代碼控制來幫助你一點。你可以有兩個分支的代碼,1.5分支和1.5分支的1.5分支。

有了這個,您可以在1.5分支上開發1.5版本,然後根據需要將您的更改/ bug修正合併到1.6分支中,然後針對特定的1.6需求進行任何代碼升級。

當您需要釋放代碼時,您可以從需要的任何分支構建它。

對於你的Eclipse,你可以維護兩個工作空間,一個用於每個分支,或者你可以只有兩套項目,每個分支一套,但你需要有不同的項目名稱,這可能會很痛苦。我會推薦工作區的方法(雖然它有它自己的痛苦)。

然後,您可以根據需要爲每個項目/工作區指定所需的JVM版本。

希望這會有所幫助。

(補充:這也將使得在這樣的時候,輕鬆過渡,當你不再需要1.5的支持,您只需關閉分支,開始只在1.6分支工作)

0

一種選擇是將代碼分解成3個項目。

一個項目將包含常見的東西,這些東西可以在任一版本的java上運行。

一個項目將包含java6實現,並將取決於通用項目。

一個項目將包含java5實現並取決於通用項目。

將事情分解爲與實現這些接口的實現的接口,可以消除任何構建依賴關係。你幾乎肯定需要這種或那種依賴注入來幫助你將具體的類連接起來。

在Eclipse中工作時,可以將java6項目設置爲目標java6,將另外2個項目設置爲目標java5。通過按項目選擇項目基礎上的JRE,您會看到您錯過的任何依賴關係。

通過讓您的構建文件變得有點聰明,您可以通過兩種方式構建通用位,並依賴於正確的版本進行部署 - 儘管我不確定這會帶來多少好處。

您最終會得到兩個不同版本的應用程序 - 一個用於java6,一個用於java5。

相關問題