2014-10-01 69 views
3

我維護用Java編寫的Java tutorial application,它演示了Java 6,7和8的功能。每個教程屏幕都根據需要由Class.forName動態加載。 Java 7類需要使用Java 7結構,Java 8類需要使用Lambda和Date/Time API。如何在Java中定位較低的語言級別

我希望這可以被所有這三種語言級別的用戶訪問,只是如果他們在Java 6上,我們不會加載Java 7或8類,如果在7上我們不會加載Java 8類。

我們將動態地確定運行時級別並忽略更高級別,只能通過Class.forName()加載相關的類。很顯然,使用Java 6或7的用戶將無法用8的幻數執行代碼。因此,我想在構建中定位較早的Java版本。

換句話說,我想源設置爲1.8和目標〜1.6

然而Maven的(和javac)阻止我指定目標比源下。

有沒有其他辦法?

我以前用Android的JavaFX代碼完成了這個工作,在那裏我可以使用Lambdas構建JavaFX 8代碼,但是隨後將它部署到當前的Android版本。但在那種情況下,有一個特殊的SDK處理lambda表達式並構建到Java 7.

有沒有什麼辦法可以用標準Java 8來實現呢?

+2

你唯一的選擇是'-source 1.1 -target 1.0'在其他情況下,它們必須是相同的。 – 2014-10-01 18:16:18

+1

您需要爲每個版本和另一個版本組合一個jar。 – 2014-10-01 18:18:01

+1

:(我很害怕你會這麼說 – 2014-10-01 18:21:02

回答

1

你唯一的選擇是-source 1.1 -target 1.0在任何其他情況下,他們必須同

你需要建立每個版本一個罐子,另一它結合了他們。

+0

我只是想知道JavaFX 8如何讓你使用Lambdas https://developer.android.com/sdk/index.html基於https://github.com/orfjackal/retrolambda並將它們部署到較早的Android版本。此外,Spring 4與Java 6u18及更高版本兼容,但它支持Java 8.他們怎麼做的? – 2014-10-01 19:00:19

+1

@VictorGrazi我相信Android不會運行字節碼,但會從中翻譯代碼。在此翻譯中,您可以解除限制或以任何方式翻譯限制。 – 2014-10-01 19:02:18

+0

好點,這就是答案。春季4如何? – 2014-10-01 19:03:12

1

您將不得不製作3個不同的罐子,每個版本都有一個罐子,其中更高版本包含更多的代碼示例。 (在好的一面,你只需要多次重新編譯java 6和7代碼)

對於每個jar將-target代碼分別設置爲6,7或8。您也可以選擇使用-source參數並將其設置爲相同的值,但我認爲您不需要,除非您擔心您意外地放入了稍後的語言功能。

相關問題