9

如果可用,我有兴趣使用 Java 7 SDK 中的一些 NIO2 功能(特别是文件系统观察程序),但是我不想为 Java 7 编译我的类并排除 Java 6 运行时。主要是因为我想保持与 Mac OS X 的兼容性,也因为我不想强迫我的用户升级。

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

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

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

4

4 回答 4

9

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

于 2011-09-29T23:47:38.500 回答
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 中引入的。

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

于 2011-09-29T14:44:01.800 回答
0

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

于 2011-09-29T14:32:01.487 回答
0

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

如果您想要一个更全面的库,请查看http://commons.apache.org/jci/commons-jci-fam/index.html - 我相信它会做类似的事情,尽管我从未使用过它。

指定源 1.7 和目标 1.6 我很确定不会工作,我出于不同的原因尝试了一段时间,并且从内存中 JVM 抱怨不兼容的标志(我的猜测是因为 7 中的新调用动态。)

于 2011-09-29T14:38:22.257 回答