在 Java 6 中使用 Java 7 SDK 功能

Posted

技术标签:

【中文标题】在 Java 6 中使用 Java 7 SDK 功能【英文标题】:Using Java 7 SDK features in Java 6 【发布时间】:2011-11-27 18:23:52 【问题描述】:

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

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

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

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

【问题讨论】:

既然我认为这些功能在 SE7 中开始存在,您认为您将如何使用 SE6 兼容模式进行编译并保留它们? 我想做的只是当程序在 Java 7 运行时执行时才使用它们,如果没有,则回退到其他行为。请注意,我说的是 Java 7 SDK 功能,而不是语言功能。 抱歉,需要两个代码库(或者,至少,每个环境都有一个单独的文件处理库,并为每个版本创建单独的输出,因为在版本 X 中编译的代码通常不会在任何较低编号的版本中工作) java 6 在 java 7 VM 上运行(但 AFAIK 不是相反) 【参考方案1】:

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

【讨论】:

它有效,谢谢!我在 Eclipse 中配置了 JDK 7 来处理语法高亮,并使用目标 Java 6 构建。对于不存在的方法调用,您必须捕获 NoSuchMethodError。 @Laurens @EJP。我不明白,你怎么能用 -target 1.6 构建源代码 1.7?不是给你吗:javac: source release 1.7 requires target release 1.7 @Pacerier 诀窍是使用源代码 1.6 而不是 1.7 构建,并且只需调用 1.7 SDK 中的方法。可能需要在您的编辑器中进行一些配置,以防止它抱怨并让代码完成工作,否则它就可以工作。 @Pacerier 我到底在哪里说过 -source 1.7?【参考方案2】:

正如工具包指出的那样,您可以轻松地为 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。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

如果在 Java 6 上运行,我不需要该功能,它对于在 Java 7 上运行的用户是可选的。在这种特殊情况下,我可能会求助于轮询或显式刷新行为。

以上是关于在 Java 6 中使用 Java 7 SDK 功能的主要内容,如果未能解决你的问题,请参考以下文章

FISCO BCOS JAVA SDK(以HelloWorld合约为例)

Windows 7下java SDK下载安装及环境变量设置

在 Java 6 和 Java 7 中使用透明窗口

在 Tomcat 6-Java 7/8 中运行 Tomcat 6-Java 6 WebApps

hadoop 2.7.7 的 AWS-Java-SDK 版本问题

如何在Java 6中使用为Java 7编译的库?