При попытке создать Java-приложение Maven в контейнере Docker я обнаружил странную ошибку в модуле запуска тестов Surefire:
[ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /app && /opt/java/openjdk/bin/java -jar /app/target/surefire/surefirebooter15847623166706412603.jar /app/target/surefire 2019-02-15T20-04-23_904-jvmRun1 surefire15681748693720284143tmp surefire_01815807763590795362tmp
Ошибка возникает при использовании образа Docker JDK11 на основе AlpineLinux ( accepttopenjdk / openjdk11: jdk-11.0.2.9-alpine ).Он последовательно воспроизводится в этом минимальном проекте Maven: https://github.com/mxxk/mvn-surefire-plugin-failure.
После неудачного запуска теста единственным файлом в target/surefire-reports
является: 2019-02-15T20-04-23_904.dumpstream
, а его содержимое равно
# Created at 2019-02-15T20:04:24.258
Error: Invalid or corrupt jarfile /app/target/surefire/surefirebooter15847623166706412603.jar
Следующим шагом будет копаться в этом surefirebooter*.jar
файле и почему он считается поврежденным, но, увы, он только временный и удаляется после запуска mvn test
.
Как ни странно, этот тест Surefireпроисходит только сбой плагина:
- При использовании режима Surefire для разветвления новой JVM (поведение по умолчанию);и
- в образе Docker на основе Alpine Linux.Он не воспроизводится на изображении, основанном на Ubuntu.
См. https://github.com/mxxk/mvn-surefire-plugin-failure для получения дополнительной информации.
Обновление 1
Это кажетсясвязанный с https://github.com/carlossg/docker-maven/issues/90. Согласно совету в этом вопросе, другим обходным путем для этого является отключение системного загрузчика классов в плагине Surefire:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
Это действительно устраняет проблему с плагином Surefire.Тем не менее, это всего лишь обходной путь для любой корневой причины.
Обновление 2
Переключение образа Docker JDK11 с вышеупомянутого на Azul Zulu OpenJDK ( azul /zulu-openjdk-alpine: 11 ) исправляет проблему без каких-либо других обходных путей.Это действительно интересно, так как я использовал их изображение на основе Alpine, поэтому я ожидаю, что та же проблема.
¯ \ _ (ツ) _ / ¯