2009-11-19 174 views
11

我想要一個可以使用javac/ecj設置爲Java 5而不是Java 6(即使底層Java運行時爲Java 6)的源文件。是否有Java程序片段可以在JRE 6上使用Java 5編譯器進行編譯,但是不能使用Java 6編譯器進行編譯?

這是可以肯定,編譯器級別正確設置在Eclipse 3.5和Java 6安裝運行,但如果結果需要在Java 5的安裝運行。

對於Java 1.4,我可以使用「枚舉」作爲變量名(其中的Java 5及更高版本下失敗),但我無法找到一個類似的方法對Java 5比6(及更高版本)。

對此提出建議?

+0

爲什麼不在eclipse上改變編譯器級別? – 2009-11-19 12:53:29

+0

@Diago,從問題「這是爲了確定編譯器級別設置正確」。 – 2009-11-19 12:58:05

+0

在JDK5和6之間語言中沒有任何東西被刪除。如前所述,添加的唯一東西是接口方法上的重寫註釋 - 因此不是關鍵字。因此,你被困在圖書館的差異,恐怕 – 2009-11-19 13:41:06

回答

14

沒有什麼在Java語言這是刪除 JDK5和6向其中加入的唯一的事情之間,正如人們所說的,是@Override註釋是接口方法上允許的 - 沒有關鍵字。因此,我擔心,你只剩下圖書館差異是導致變革的唯一原因。

這些確實存在,即使在覈心API中;在向後兼容的突破性狂歡中,他們改變了ExecutorService界面上某些方法的簽名。這是因爲這些方法的通用簽名過於嚴格。這是一個純庫變化(雖然,爲的java.util,一個相當核心庫部分);與任何語言級別的修改無關。

例如,from JDK5

<T> T invokeAny(Collection<Callable<T>> tasks) 

to JDK6

<T> T invokeAny(Collection<? extends Callable<T>> tasks) 

這意味着,包含的代碼實現這個接口在JDK5任何程序,也不會對JDK6編譯。一個片段很容易創建;讓你的IDE創建一個JDK5接口的空實現,然後構建JDK6。

注意:添加通配符,因爲以前的版本不會接受像List<MyCallable<String>>參數(即收集由可調用的某個子類類型),而後來的版本則

+0

+1思路不錯 – skaffman 2009-11-19 13:33:50

+1

好抓。 +1(這裏說明http://old.nabble.com/Incompatible-API-change-between-Java-5-and-Java-6--td22983799.html) – VonC 2009-11-19 13:34:59

+0

我可以證明被此事咬傷 - 現在我們必須支持我們一些代碼的兩個版本,純粹是因爲這個庫變化 – 2009-11-19 13:36:06

2

由於JVMDI已被刪除,Java SE 6中的JVMPI被禁用(根據J2SE 6.0 release note),您可以使用該API添加代碼:它不會使用J2SE 6.0進行編譯,僅編譯爲5.0。 (如this thread所示)

+0

如果我正確地理解你,這是一個JRE的差異,而不是語言的變化?那麼它將取決於所使用的JRE,而不是編譯器級別?我不想在開發時使用Java 5,只是發現編譯器級別不正確。 – 2009-11-19 13:00:53

+0

@Thorbjørn:是的,我找不到任何可以編譯的實際代碼,只有在運行時加載的動態庫。所以,現在,這不是一個合適的解決方案(我保留在CW模式下進行存檔) – VonC 2009-11-19 13:32:04

0

不是您的問題的答案,而是您的方法的替代方案:是否有可能使用基於ant或maven的第二個構建器,您可以根據需要使用它來創建最終的應用程序或庫?此版本將使用真正的外部Java 5 SDK,從而保證應用程序/庫在Java5環境中運行。

+0

是的。我們有一個構建系統,它可以在正確的級別上構建工件等,但是這需要時間,但是在開發過程中,我經常需要在我的PC上使用Eclipse進行構建,然後在開發機器上運行(只有Java 5,而不是PC )。因此,需要確定使用Java 5.我們經常創建新的工作區,因爲Eclipse中的工作集工具是一個笑話。 – 2009-11-19 15:41:47

+1

完全同意工作集功能。一個工作區/項目也是我在做的;) – 2009-11-19 15:52:43