Компилировать в Java 6, запустить в 7 - как указать useLegacyMergeSort?

Мне интересно, компилирую ли я на Java 6, но кто-то запускает программу на Java 7, будет ли использоваться версия Java Array.sort на Java 6 или 7?

Это важно, потому что новый mergesort выбрасывает исключение IllegalArgumentException, а старый - нет (см. Метод сравнения нарушает его общий контракт! Только Java 7)

Теперь можно скомпилировать в Java 7 с помощью Arrays.useLegacyMergeSort, но, очевидно, этот флаг недоступен для Java 6 - и мы хотим быть совместимыми с Mac OS Snow Leopard (который использует 6).

По какой-то причине (см. http://madbean.com/2006/target14/), флаг компилятора -target, похоже, не создает совместимый код, поэтому мы скорее компилируются в Java 6.

Любые предложения?

Ответы

Ответ 1

попытайтесь установить системное свойство

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

Обратите внимание, что это не из общедоступного API Array, а из 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();
    }