2014-10-01 70 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参数并将其设置为相同的值,但我认为您不需要,除非您担心您意外地放入了稍后的语言功能。

相关问题