2013-04-09 14 views
15

Zastanawiam się, czy mogę skompilować w Javie 6, ale ktoś uruchamia program na Java 7, czy będzie używana wersja Arrays.sort Java 6 lub 7?Skompiluj w Javie 6, uruchom w 7 - jak określić useLegacyMergeSort?

To ważne, ponieważ nowa mergesort rzuca IllegalArgumentException, a stara nie (patrz Comparison method violates its general contract! Java 7 only)

Teraz jest to możliwe, aby skompilować w Java 7 za pomocą Arrays.useLegacyMergeSort, ale oczywiście, że flaga nie jest dostępne dla środowiska Java 6 - i chcemy być kompatybilne z Mac OS Snow Leopard (który używa 6).

Z jakiegoś powodu (patrz http://madbean.com/2006/target14/) -target flag kompilatora nie wydaje się produkować kod zgodny, więc wolimy skompilować w Java 6.

Wszelkie sugestie?

+8

Opcja 'nieruchomość java.util.Arrays.useLegacyMergeSort' jest określony w czasie wykonywania , nie kompiluj. Jakie masz problemy podczas korzystania z maszyny wirtualnej Java 6? – Perception

+0

Użyjesz wersji 7 na maszynie wirtualnej JVM w wersji 7, nawet jeśli skompilujesz ją w stosunku do wersji 6. Wystarczy ustawić właściwość System, aby zawsze używać sortowania wersji 6. – BevynQ

+3

@Alex: jeśli nowy mergesort rzuca IAE, to dlatego, że twój kod jest nieprawidłowy, czy działa w Javie 6 czy Java 7. To, co powinieneś zrobić, to naprawienie tego problemu, w którym to momencie twój kod będzie działać tak samo w obu środowiska. –

Odpowiedz

18

spróbuj ustawić właściwość systemu

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

pamiętać, że nie jest z Array publicznych API ale z 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(); 
    } 
+0

Ah, oops! Myślałem, że to była alternatywna metoda, a nie flaga ... tak użytkownik java 7 będzie działał podobnie do java -jar -Djava.util.Arrays.useLegacyMergeSort = true Program.jar, czy to prawda? – Alex

+0

raczej java -Djava.util.Arrays.useLegacyMergeSort = true -jar Program.jar –

Powiązane problemy