我有兴趣使用Java 7 SDK中的一些NIO2功能(具体来说,file system watchers),但是我不想为Java 7编译我的类并排除Java 6运行时。主要是因为我希望保持与Mac OS X的兼容性,还因为我不想强迫我的用户升级。
这可能吗?最好的方法是什么?任何链接或示例?
以下是我可以想象的一些方法:使用不同的编译器编译类文件并根据Java版本动态加载它?或者也许使用反射?或者可能只有Java 7的编译器设置来生成与Java 6兼容的类?
我正在寻找一个不会变成丑陋混乱的解决方案:),所以理想情况下我可以编写两个接口实现,一个使用新功能,一个不使用,然后动态选择一个而不是必须到处都是反思电话。
答案 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。 )