Тесты Maven завершаются неудачно с «разветвленной виртуальной машиной, завершенной» в Docker - PullRequest
0 голосов
/ 15 февраля 2019

При попытке создать 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, поэтому я ожидаю, что та же проблема.

¯ \ _ (ツ) _ / ¯

...