Maven Test выдает исключение в Ubuntu - PullRequest
0 голосов
/ 31 октября 2018

Поскольку событие, которого я не знаю, вызов mvn test больше не работает в моем Ubuntu 18.04. (работает с апреля). mvn install -DskipTests=true или любая другая фаза жизненного цикла, которую я пробовал, работает хорошо.

Если я запускаю, например, mvn test в последней версии Apache Commons IO, клонированной в /home/reichelt/commons-io/, если отображается

[ERROR] ExecutionException The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /home/reichelt/commons-io && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Xmx25M -jar /home/reichelt/commons-io/target/surefire/surefirebooter6661636703131088733.jar /home/reichelt/commons-io/target/surefire 2018-10-31T18-30-50_926-jvmRun1 surefire4405197448341812663tmp surefire_1048154306090710821475tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.awaitResultsDone(ForkStarter.java:494)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.runSuitesForkPerTestSet(ForkStarter.java:441)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:293)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1149)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:978)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:854)
[ERROR]     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
[ERROR]     at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR]     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
[ERROR]     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
[ERROR]     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
[ERROR]     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:955)
[ERROR]     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:290)
[ERROR]     at org.apache.maven.cli.MavenCli.main(MavenCli.java:194)
[ERROR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]     at java.lang.reflect.Method.invoke(Method.java:498)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
[ERROR] Caused by: 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 /home/reichelt/commons-io && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Xmx25M -jar /home/reichelt/commons-io/target/surefire/surefirebooter6661636703131088733.jar /home/reichelt/commons-io/target/surefire 2018-10-31T18-30-50_926-jvmRun1 surefire4405197448341812663tmp surefire_1048154306090710821475tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:671)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:533)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.access$600(ForkStarter.java:115)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter$2.call(ForkStarter.java:429)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter$2.call(ForkStarter.java:406)
[ERROR]     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[ERROR]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[ERROR]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[ERROR]     at java.lang.Thread.run(Thread.java:748)

В целевых / верных отчетах содержится много повторений

# Created on 2018-10-31T18:31:48.243
Error: Could not find or load main class org.apache.maven.surefire.booter.ForkedBooter 

Любой другой проект, который я пробовал, показывает похожее поведение.

Я попытался загрузить maven 3.5.4, разархивировать его, добавить к пути с помощью export PATH=/home/reichelt/Downloads/apache-maven-3.5.4-bin/apache-maven-3.5.4/bin:$PATH и запустить более новую версию, но это ничего не изменило (хотя mvn -version работает правильно и показывает более новую версию). То же самое происходит с Maven 3.5.0.

Ошибка Maven: не удалось найти или загрузить основной класс org.codehaus.plexus.classworlds.launcher.Launcher предполагает, что настройка export M3_HOME=/usr/share/maven и export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ должна помочь, но, к сожалению, это не помогло.

Я попытался удалить ~/.m2, но, к сожалению, это тоже не помогло.

Запуск этого в док-контейнере с docker run -it ubuntu и запуск

apt update
apt install -y openjdk-8-jdk maven git
mvn -version
git clone https://github.com/apache/commons-io.git
cd commons-io/
mvn test

приводит к тому же поведению, так что, похоже, это проблема не только моей установки.

Бег docker run -it fedora bash и

yum install java-1.8.0-openjdk.x86_64*
yum install wget
wget http://ftp-stud.hs-esslingen.de/pub/Mirrors/ftp.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
tar -xvf apache-maven-3.5.4-bin.tar.gz 
yum install git
export PATH=/apache-maven-3.5.4/bin:$PATH
mvn -version
git clone https://github.com/apache/commons-io.git
cd commons-io/
mvn test

запускает тесты, как и ожидалось, неожиданно.

Кто-нибудь знает, как решить эту проблему / обойти ее?

EDIT Как следует из сообщения, это похоже на проблему с ForkedBooter, которую невозможно найти. https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html описывает, что верный огонь может использоваться изолированным загрузчиком классов в загрузочном фляге или банкой только для манифеста. Похоже, по умолчанию я использую jar-файл только для манифеста, который содержит что-то вроде:

Manifest-Version: 1.0
Class-Path: file:/home/reichelt/.m2/repository/org/apache/maven/surefi
 re/surefire-booter/2.21.0/surefire-booter-2.21.0.jar file:/home/reich
 elt/.m2/repository/org/apache/maven/surefire/surefire-api/2.21.0/sure
 fire-api-2.21.0.jar file:/home/reichelt/.m2/repository/org/apache/mav
 en/surefire/surefire-logger-api/2.21.0/surefire-logger-api-2.21.0.jar
  file:/home/reichelt/commons-io/target/test-classes/ file:/home/reich
 elt/commons-io/target/classes/ file:/home/reichelt/.m2/repository/jun
 it/junit/4.12/junit-4.12.jar file:/home/reichelt/.m2/repository/org/h
 amcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar file:/home/reichelt/.
 m2/repository/org/apache/maven/surefire/surefire-junit4/2.21.0/surefi
 re-junit4-2.21.0.jar
Main-Class: org.apache.maven.surefire.booter.ForkedBooter

Мне кажется, это нормально: /home/reichelt/.m2/repository/org/apache/maven/surefire/surefire-booter/2.21.0/surefire-booter-2.21.0.jar в порядке и содержит файл класса для org.apache.maven.surefire.booter.ForkedBooter.

Путем добавления

<useSystemClassLoader>true</useSystemClassLoader>
<useManifestOnlyJar>false</useManifestOnlyJar>

до pom, сборки запускаются снова. Похоже, это решение, которое не использует ForkedBooter. Хотя это обходной путь, я все же хотел бы понять: могу ли я продолжить отладку этой проблемы, чтобы найти причину, пока она не работает с текущей Ubuntu? Поскольку он не работает с другими версиями maven (даже в свежем док-контейнере Ubuntu), но работает с контейнером Fedora, я предполагаю, что причина как-то связана с конфигурацией Ubuntu по умолчанию.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Забавная история: действительно, это была проблема обновления OpenJDK.

Я прочитал мою прошлую историю по sudo zcat /var/log/apt/history.log.1.gz | less (в зависимости от логротирования это был .1, может быть что-то еще). Это показало, что сегодня утром было запущено обновление:

Start-Date: 2018-10-31  10:38:04
Commandline: /usr/bin/unattended-upgrade
Upgrade: openjdk-8-jdk:amd64 (8u181-b13-0ubuntu0.18.04.1, 8u181-b13-1ubuntu0.18.04.1), openjdk-8-jre:amd64 (8u181-b13-0ubuntu0.18.04.1, 8u181-b13-1ubuntu0.18.04.1), openjdk-8-jdk-headless:amd64 (8u181-b13-0ubuntu0.18.04.1, 8u181-b13-1ubuntu0.18.04.1), openjdk-8-jre-headless:amd64 (8u181-b13-0ubuntu0.18.04.1, 8u181-b13-1ubuntu0.18.04.1)
End-Date: 2018-10-31  10:38:09

Так что по некоторым причинам OpenJDK 8u181 кажется несовместимым с maven 3.5.2 и верным. Поскольку я уже установил обновление пакета, я снова понизил его до sudo apt install openjdk-8-jdk=8u162-b12-1 openjdk-8-jre=8u162-b12-1 openjdk-8-jdk-headless=8u162-b12-1 openjdk-8-jre-headless=8u162-b12-1. Теперь тестирование снова работает.

В https://www.oracle.com/technetwork/java/javase/8u-relnotes-2225394.html, там Java 8u171, 8u172 и 8u181, по-видимому, не содержат обновлений, которые делают невозможным использование jar-файла только для maninfest, но я только посмотрел чуть выше и не углубился в ошибку отчеты.

РЕДАКТИРОВАТЬ Ошибка уже сообщена в OpenJDK: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=911925

РЕДАКТИРОВАТЬ 2 Эта ошибка исправлена ​​в Java 1.8.0_191, и тест mvn снова работает нормально.

0 голосов
/ 01 ноября 2018

Сегодня столкнулся с той же проблемой. Не уверен в лучшем долговременном исправлении, но установка forkCount в 0 для maven-surefire-plugin, кажется, исправила это для меня на данный момент. Вероятно, к сожалению, тесты занимают больше времени.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <forkCount>0</forkCount>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
  </configuration>
</plugin>

Надеюсь, это поможет.

...