Maven测试在Ubuntu中抛出异常



由于一个我不知道的事件,调用mvn test在我的Ubuntu 18.04中不再工作。(自4月起运行(。mvn install -DskipTests=true或我尝试过的任何其他生命周期阶段都运行良好。

例如,如果我在克隆到/home/reichelt/commons-io/中的Apache Commons IO的最新版本中运行mvn test,如果显示

[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/mavenexport JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/应该有帮助,但不幸的是,它没有。

我尝试删除~/.m2,但不幸的是,这也没有帮助。

在带有docker run -it ubuntu的docker容器中运行此程序并运行

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描述了surefire可以由booter jar中的独立类加载器使用,也可以由manifest-only jar使用。默认情况下,我使用的是一个只包含清单的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,构建再次运行。这似乎是一个不使用CCD_ 15的解决方案。虽然这是一个变通方法,但我仍然想了解:我可以进一步调试这个问题吗,以便在当前Ubuntu不工作的情况下找到原因?由于它不适用于其他maven版本(即使是在新的Ubuntu docker容器中(,但适用于Fedora容器,我认为原因与Ubuntu默认配置有关。

有趣的故事:事实上,这是一个OpenJDK更新问题。

我通过sudo zcat /var/log/apt/history.log.1.gz | less阅读了我的上一次历史(根据logrotating,它是.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和surefire不兼容。由于我已经安装了软件包升级,我使用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似乎不包含更新,这使得使用maninfest only jar of surefire变得不可能,但我只是简单地看了一下,没有深入研究错误报告。

EDITOpenJDK上已经报告了该错误:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=911925

EDIT 2此错误已在Java 1.8.0_191中修复,mvn测试再次正常运行。

今天遇到了同样的问题。不确定最佳的长期修复方案,但将maven surefire插件的forkCount设置为0似乎已经为我修复了它。不幸的是,这可能会使测试耗时更长。

<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>

希望能有所帮助。

最新更新