У меня есть несколько модульных тестов, которые содержат код, подобный следующему:
File file = new File("src/main/java/com/pany/Foo.java");
assertTrue("Missing file: " + file.getAbsolutePath(), file.exists());
Этот тест неожиданно завершается с ошибкой при запуске его с 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 года.
- I 'Я использую 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()
устанавливается абсолютный путь?