我对使用Java7SDK中的一些NIO2特性(特别是file system watchers)很感兴趣,但是我不想为Java7编译我的类并排除Java6运行时。主要是因为我想保持与Mac的兼容性,也因为我不想强迫我的用户升级。
这个是可能的吗?做这件事最好的方法是什么?有什么链接或例子吗?
这里有一些我可以想象的方法:用不同的编译器编译一个类文件,然后基于Java版本动态加载它?或者使用反射?或者,可能只有Java 7的编译器设置可以生成与Java 6兼容的类?
我正在寻找一种不会变成丑陋的混乱的解决方案:),所以理想情况下,我可以编写接口的两个实现,一个使用新功能,另一个不使用新功能,然后动态选择一个,而不是到处进行反射调用。
发布于 2011-09-30 07:47:39
只需使用-target 1.6构建并组织您的代码,这样您就可以在使用1.7的模块周围干净地捕获ClassNotFoundExceptions和NoClassDefFoundErrors。例如,可以使用单独的类加载器加载它们。
发布于 2011-09-29 22:44:02
正如工具包所指出的,你可以很容易地为java1.6构建。但是,您需要确保您不会意外地访问任何在java6中不存在的方法,这将在您的生产代码中导致运行时异常。
如果你使用的是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中引入的。
另一种解决方案是构建两个jars,一个使用新的nio内容,另一个使用旧的内容,并在安装时检测用户是否正在运行java 1.7。如果是,则添加包含适当实现的jar。
发布于 2011-09-29 22:32:01
对于Java 7中添加的一些元素,您可能能够找到为您提供此功能的Java 6 jsr jars。然而,我不相信文件系统观察者会出现这种情况。
https://stackoverflow.com/questions/7598789
复制相似问题