【问题标题】:Compile in Java 6, run in 7 - how to specify useLegacyMergeSort?在 Java 6 中编译,在 7 中运行 - 如何指定 useLegacyMergeSort?
【发布时间】:2013-04-09 04:43:55
【问题描述】:

我想知道如果我在 Java 6 中编译,但有人在 Java 7 上运行程序,会使用 Java 6 或 7 版本的 Arrays.sort 吗?

这很重要,因为新的合并排序会引发 IllegalArgumentException,而旧的不会(请参阅 Comparison method violates its general contract! Java 7 only

现在,可以使用 Arrays.useLegacyMergeSort 在 Java 7 中进行编译,但显然该标志不适用于 Java 6 - 我们希望在 Mac OS Snow Leopard(使用 6)上兼容。

出于某种原因(请参阅http://madbean.com/2006/target14/),-target 编译器标志似乎无法生成兼容的代码,因此我们宁愿在 Java 6 中编译。

有什么建议吗?

【问题讨论】:

  • java.util.Arrays.useLegacyMergeSort 属性是在运行时指定的,而不是编译时指定的。将它与 Java 6 VM 一起使用时遇到了什么问题?
  • 即使您针对版本 6 进行编译,您仍将在版本 7 JVM 上使用版本 7。只需设置 System 属性,您将始终使用版本 6 排序。
  • @Alex:如果新的合并排序抛出 IAE,那是因为你的代码是错误的,无论它是在 Java 6 还是 Java 7 中运行。你应该做的是解决这个问题,此时你的代码将在两种环境中运行相同。
  • @LouisWasserman:嗯,是的,不是的!如果代码按照它的意图去做,并且可读和可维护,那么它是否满足这个明显的契约真的是个问题吗?
  • @Alex 这就是合同的重点:只有在你这样做的情况下,你才能确保对方也履行了承诺。以前,它实现了它(或者似乎这样做了——我想以前结果可能不一致)即使你没有,但现在为了更好的实现而改变了。

标签: java javac


【解决方案1】:

尝试设置系统属性

java -Djava.util.Arrays.useLegacyMergeSort=true ...

请注意,它不是来自 Arrays 公共 API,而是来自 src

   /**
     * Old merge sort implementation can be selected (for
     * compatibility with broken comparators) using a system property.
     * Cannot be a static boolean in the enclosing class due to
     * circular dependencies. To be removed in a future release.
     */
    static final class LegacyMergeSort {
        private static final boolean userRequested =
            java.security.AccessController.doPrivileged(
                new sun.security.action.GetBooleanAction(
                    "java.util.Arrays.useLegacyMergeSort")).booleanValue();
    }

【讨论】:

  • 啊,哎呀!我认为这是一种替代方法,而不是标志......所以 java 7 用户将运行类似 java -jar -Djava.util.Arrays.useLegacyMergeSort=true Program.jar 的东西,对吗?
  • 而是 java -Djava.util.Arrays.useLegacyMergeSort=true -jar Program.jar
猜你喜欢
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 2021-04-23
  • 2017-01-28
  • 2013-01-20
  • 2014-10-12
相关资源
最近更新 更多