【问题标题】:Using Java 7 SDK features in Java 6在 Java 6 中使用 Java 7 SDK 功能
【发布时间】: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 不是相反)

标签: java java-7 nio2


【解决方案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 上运行的用户是可选的。在这种特殊情况下,我可能会求助于轮询或显式刷新行为。
      猜你喜欢
      • 1970-01-01
      • 2012-07-17
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多