2010-11-12 47 views
1

我有一個運行在嵌入式設備上的Java應用程序。由於不同的設備運行不同版本的設備SDK,因此我必須針對〜5種不同的設備SDK組合進行構建。如何在編譯/運行時有條件地刪除我的應用程序的一部分?

其中一種組合不支持現有對象上的特定方法,而完全從SDK中省略另一個對象。

我在我的程序中使用了這個方法和對象,但是隻有在某個配置中,所以我想回退到不支持它的設備上的另一個配置。

我很樂意在編譯或運行時執行此回退行爲。

什麼是有條件地刪除此代碼的最簡單方法?

代碼在其他方面是相同的,因此我不希望爲兩個SDK創建兩個單獨的代碼分支。

我使用Ant腳本構建我的應用程序。

我的應用程序必須針對相當舊版本的JDK(1.1.8/1.2)進行構建。

回答

2

一個想法是使用isSupported()方法創建具有相同接口,完整實現和存根的兩個類,並且存根中的所有其他方法都會引發UnsupportedOperationException。然後,我可以在編譯期間在我的Ant腳本中有條件地包含正確的類。

我選擇採用這種方式而不是更具動態性的方法@Stephen C,因爲它對我們的目的非常有效,我們對設備(包括設備文件系統)的訪問非常有限,難以部署多個罐子,設置類路徑,是等

我最終什麼事做如下:

  1. 的舉動,這需要磕碰到一個單獨的包中的類。
  2. 創建一個新目錄mypackagenamestub並將要被樁入的文件複製到它。確保您的IDE不會更改要存檔文件的包聲明。
  3. 我們已經在我們的Ant腳本中設置了SDK路徑屬性,該屬性基於應用程序構建的SDK,因此我添加了另一個屬性omit.unsupportedmode(釋義),並在適當的位置將其設置爲true。
  4. 使用條件任務設置值以傳遞到javac的excludes屬性,例如, **/MyPackageStub/****/MyPackage/**根據omit.unsupportedmode
2

@勞倫斯約翰斯頓的自我回答草圖如何在構建時做到這一點。我認爲這基本上是正確的想法,但你可能不希望插件API拋出檢查異常。理想情況下,您希望舊版平臺的實現能夠「盡最大努力」嘗試執行所請求的功能。

如果你想在運行時你可以決定:

  • 把不同版本的類切割成單獨的JAR文件,並使用一個包裝腳本,包括在應用程序的classpath適當的JAR文件。

  • 使用Class.forName()來動態加載適合該平臺的類的版本。

在這兩種情況下,你需要確保基本應用程序類(即旨在在所有平臺上工作)不會靜態地依賴於任何更高級的SDK /的JDK。

最後,我傾向於支持古老的Java版本。他們在很多年前就已經「終結了生命」,而支持他們的要求顯然阻礙了你。例如,在覈心應用程序中向後兼容的要求意味着它無法利用最近Java版本中添加的許多新功能。有多少客戶仍在使用這些古老的Java版本?他們爲什麼不能升級他們的平臺?他們真的需要最新版本的應用程序嗎?

+0

謝謝,這很有幫助。最後一個問題的答案是我絕對必須支持Java的古老版本,因爲這就是設備製造商選擇放在設備上的原因。即使我們支持的最新設備也不支持最新的Java版本。 – 2010-11-12 01:06:25

+0

我也可以更清楚地知道所討論的對象/方法是設備製造商SDK的一部分,而不是JDK。 JDK版本限制只是一個額外的限制。 – 2010-11-12 01:13:32

+0

嗯......所有設備製造商都沒有升級Java平臺的事實實際上可能是一個幸事,儘管我當然不羨慕你的工作:-) – 2010-11-12 01:51:11

相關問題