У меня есть куча модульных тестов, которые содержат такой код:
File file = new File("src/main/java/com/pany/Foo.java");
assertTrue("Missing file: " + file.getAbsolutePath(), file.exists());
Этот тест неожиданно -DforkCount=0
неудачей при запуске с Maven Surefire и -DforkCount=0
. С -DforkCount=1
это работает.
Вещи, которые я пробовал до сих пор:
- Файл существует. Проводник Windows, командная строка (копирование и вставка), текстовые редакторы, Cygwin могут все найти и показать содержимое. Вот почему я думаю, что это не проблема разрешения.
- Это не изменено модульными тестами или чем-то еще. Git не показывает изменений за последние два месяца.
- Я проверил файловую систему, она чистая.
- Я пробовал другие версии Java 8, а именно 8u171 и 8u181. Та же проблема.
- Я запустил Maven из Cygwin и командной строки. Тот же результат.
- Перезагрузка :-) Нет эффекта :-(
Больше деталей:
- Когда я вижу эту проблему, я начинаю видеть, что "разветвленная виртуальная машина прервалась, не сказав должным образом до свидания. Сбой виртуальной машины или вызванный System.exit?" в других проектах. Вот почему я попытался использовать
forkCount=0
что часто помогает в этом случае выяснить, почему разбилась разветвленная виртуальная машина. - Это началось недавно, возможно, в октябре 2018 года, в обновлении Windows 10. До этого сборки были непоколебимы в течение трех лет. Думаю, моя машина была переведена на Windows 10 в конце 2017 года.
- Я использую Maven 3.6 и не могу легко попробовать старую версию из-за важной ошибки, которая была исправлена с ней. Я видел сбой VM выше с Maven 3.5.2, а также.
- Это всегда одни и те же файлы, которые выходят из строя (поэтому он стабильный).
ulimit
(от Cygwin) говорит:
$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 2032
cpu time (seconds, -t) unlimited
max user processes (-u) 256
virtual memory (kbytes, -v) unlimited
Мне интересно, применяется ли ограничение "открытые файлы" 256 только к процессам Cygwin или что-то, что Cygwin читает из Windows.
Позвольте мне знать, если вам нужно что-нибудь еще. У меня заканчиваются идеи, что я могу попробовать.
Обновление 1
Бернхард попросил меня напечатать абсолютные имена. Мой ответ состоял в том, что я уже использовал абсолютные имена, но я ошибался. Фактический код был:
File file = new File("src/main/java/com/pany/Foo.java");
if (!file.exists()) {
log.debug("Missing file {}", file.getAbsolutePath());
... fail ...
}
... do something with file...
Теперь я изменил это на:
File file = new File("src/main/java/com/pany/Foo.java").getAbsoluteFile();
if (!file.exists()) {
log.debug("Missing file {}", file);
}
и это решило проблему. Я просто не могу понять почему.
Когда Maven создает разветвленную виртуальную машину для запуска тестов с Surefire, он может изменить текущий каталог. Таким образом, в этом случае имеет смысл, чтобы тесты работали при разветвлении, но не работали при работе в той же виртуальной машине (поскольку виртуальная машина была создана в корневой папке многомодульной сборки). Но почему сделать путь абсолютным до того, как вызов функции exists()
решит проблему?