使用Java 6中的Java 7 SDK功能

时间:2011-09-29 14:24:39

标签: java java-7 nio2

我有兴趣使用Java 7 SDK中的一些NIO2功能(具体来说,file system watchers),但是我不想为Java 7编译我的类并排除Java 6运行时。主要是因为我希望保持与Mac OS X的兼容性,还因为我不想强迫我的用户升级。

这可能吗?最好的方法是什么?任何链接或示例?

以下是我可以想象的一些方法:使用不同的编译器编译类文件并根据Java版本动态加载它?或者也许使用反射?或者可能只有Java 7的编译器设置来生成与Java 6兼容的类?

我正在寻找一个不会变成丑陋混乱的解决方案:),所以理想情况下我可以编写两个接口实现,一个使用新功能,一个不使用,然后动态选择一个而不是必须到处都是反思电话。

4 个答案:

答案 0 :(得分:9)

只需使用-target 1.6构建并组织代码,这样就可以在使用1.7的模块周围清楚地捕获ClassNotFoundExceptions和NoClassDefFoundErrors。例如,可以使用单独的类加载器加载它们。

答案 1 :(得分:1)

您可以轻松地为java 1.6构建工具包指出。但是,您需要确保不会意外访问java 6中不存在的任何方法。这将在生产代码中导致运行时异常。

如果你正在使用maven,你可以使用maven-enforcer-plugin,它确保没有java 1.7类或方法调用潜入你为1.6构建的代码。

一个例子是从java 1.4到1.5的变化。我用1.5制作,目标是1.4,我不小心使用了:

new BigDecimal(5);

这个编译好了,对我来说运行正常。但由于客户端仍在使用1.4,因此失败了。因为这个构造函数在1.4中不存在。它是在1.5中引入的。

另一个解决方案是构建几个罐子,一个带有新的nio东西,一个带有旧东西,并在安装时检测用户是否正在运行java 1.7。如果是这样,请添加包含相应实现的jar。

答案 2 :(得分:0)

对于Java 7中添加的一些元素,您可能能够找到能够为您提供功能的Java 6 jsr jar。我不相信文件系统观察器会出现这种情况。

答案 3 :(得分:0)

就文件系统观察者而言,在Java 7之前我曾经每隔几秒左右轮询文件的属性以检查它是否没有改变。这不是很好,但实际上它没有使用明显的资源,从最终用户的角度来看似乎也是如此。

如果您正在寻找一个更全面的图书馆,请查看http://commons.apache.org/jci/commons-jci-fam/index.html - 我相信它会做类似的事情,但我从未使用它。

指定源1.7和目标1.6我很确定无法正常工作,我尝试了一段时间的原因并且从内存中JVM抱怨不兼容的标志(我的猜测是因为7中新的invokedynamic。 )