2016-03-06 7 views
0

У меня возникла странная проблема с сортировкой файлов.Java 8 на Mac и FreeBSD различный порядок сортировки файлов по модифицированным данным

Учитывая окр

Dev: Mac OS X 10.11.3 OracleJDK 1.8.0_45 
PreProduction env: FreeBSD 10 OpenJDK 1.8.0_72 

Код

public static String getLatestTag() { 
    File tagsDir = new File("./.git/refs/tags"); 
    ... 
    File[] tags = tagsDir.listFiles(); 
    List<File> tagsList = Arrays.asList(tags); 
    Collections.sort(tagsList, (f1, f2) -> { 
     if(f1.lastModified() > f1.lastModified()) { 
      return 1; 
     } else if(f1.lastModified() == f2.lastModified()) { 
      return 0; 
     } else { 
      return -1; 
     } 
    }); 
    logTagsList(tagsList); 
    String latestTag = tagsList.get(0).getName(); 
    Logger.info("Application version is: %s", latestTag.replaceAll("[^\\d.]", "")); 
    return latestTag; 
} 

private static void logTagsList(List<File> tags) { 
    if(Logger.isDebugEnabled()) { 
     Logger.debug("Tags found"); 
     for(File tag : tags) { 
      Logger.debug("Tag: %s, Date modified: %s", tag.getName(), tag.lastModified()); 
     } 
    } 
} 

дает выход

В Mac:

17:49:50,601 DEBUG ~ Tags found 
17:49:50,602 DEBUG ~ Tag: v0.97, Date modified: 1457277455000 
17:49:50,602 DEBUG ~ Tag: v0.95, Date modified: 1455809758000 
17:49:50,602 INFO ~ Application version is: 0.97 

В FreeBSD:

18:52:49,902 DEBUG ~ Tags found 
18:52:49,903 DEBUG ~ Tag: v0.95, Date modified: 1456038720000 
18:52:49,903 DEBUG ~ Tag: v0.97, Date modified: 1457277515000 
18:52:49,904 INFO ~ Application version is: 0.95 

В обоих случаях пользователь, выполняющий приложение, имеет доступ для чтения к каталогу .git.

Шаги для воспроизведения: 1) мерзавец INIT 2) начальной загрузки приложений Java (или играть Рамочный 1.4 приложение для полного воспроизведите) 3) добавить данный код 4) сделать 2 фиксаций мерзавцу 5) маркировать эти коммиты 6) запустить приложение 7) изучить журналы

+1

См. Http://stackoverflow.com/help/mcve – Jubobs

ответ

5

Вы получили ошибку при сравнении: if(f1.lastModified() > f1.lastModified()) - Вы сравниваете f1 с f1 здесь. И если оба файла не изменяются в одно и то же время, вы всегда возвращаете -1, независимо от того, что вы сравниваете. И это приводит к непредсказуемому поведению.

+2

... и чтобы избежать таких ошибок, вместо этого используйте 'Comparator.comparingLong (File :: lastModified)'. Даже если вам нужно вручную сопоставить значения 'long', просто используйте' Long.compare (first, second) ' – Holger