最近来到一个新项目,我正在尝试编译我们的源代码。昨天一切都很好,但今天是另一个故事。
每次我在模块上运行mvn clean install
时,一旦到达测试,它就会崩溃成错误:
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ recorder ---
[INFO] Surefire report directory: /lhome/code/recorder/target/surefire-reports
[INFO] Using configured provider org.apache.maven.surefire.junitcore.JUnitCoreProvider
[INFO] parallel='none', perCoreThreadCount=true, threadCount=0, useUnlimitedThreads=false, threadCountSuites=0, threadCountClasses=0, threadCountMethods=0, parallelOptimized=true
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Error: Could not find or load main class org.apache.maven.surefire.booter.ForkedBooter
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
后来:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project recorder: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test failed: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
我正在运行Debian 9(Stretch)64位,OpenJDK 1.8.0_181,Maven 3.5.4,在我的公司代理后面工作,我在~/.m2/settings.xml
配置。
奇怪的是,如果我没记错的话,最新的Surefire版本是2.22.1。我试图指定插件版本,但它没有更新,否则在任何POM(父,祖父或这一个)都没有插件版本规范。
我设法迫使Maven将Surefire版本更改为最新版本,但现在情况更糟:
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[...]
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project recorder: There are test failures.
[ERROR]
[ERROR] Please refer to /lhome/code/recorder/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /lhome/code/recorder/ && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java '-javaagent:/lhome1/johndoe/.m2/repository/org/jacoco/org.jacoco.agent/0.7.4.201502262128/org.jacoco.agent-0.7.4.201502262128-runt ime.jar=destfile=/lhome/code/recorder/target/jacoco.exec,append=true,includes=esa/*,excludes=**/api/**/*.class' -jar /lhome/code/recorder/target/surefire/surefirebooter7426165516226884923.jar /lhome/code/recorder/target/surefire 2018-10-26T16-16-12_829-jvmRun1 surefire1721866559613511529tmp surefire_023400764142672144tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[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 /lhome/code/recorder/ && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java '-javaagent:/lhome1/johndoe/.m2/repository/org/jacoco/org.jacoco.agent/0.7.4.201502262128/org.jacoco.agent-0.7.4.201502262128-runt ime.jar=destfile=/lhome/code/recorder/target/jacoco.exec,append=true,includes=esa/*,excludes=**/api/**/*.class' -jar /lhome/code/recorder/target/surefire/surefirebooter7426165516226884923.jar /lhome/code/recorder/target/surefire 2018-10-26T16-16-12_829-jvmRun1 surefire1721866559613511529tmp surefire_023400764142672144tmp
[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:669)
[ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
[ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
[ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
[ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
[ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
[ERROR] at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
[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:56)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
[ERROR] at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
[ERROR] at org.apache.maven.cli.MavenCli.execute(MavenCli.java:954)
[ERROR] at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
[ERROR] at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
[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)
要修复它(在2018年),请将openjdk更新到最新版本,至少为8u191-b12。如果此问题在2020年再次出现,则可能是openjdk的默认行为已更改,然后您需要更新maven surefire插件。
这是一个现在已经修复的bug in the openjdk-8 package(行为偏离上游,没有必要;缺少上游补丁以恢复为禁用安全检查),您刚刚升级到。但它也是a bug in the surefire plugin, SUREFIRE-1588, supposedly fixed in surefire 3.0.0-M1:它显然是在一个Java将来只允许相对路径名称的地方使用绝对路径(而Debian已经激活了未来的行为)。
包版本8u181-b13-2说明:
请注意,191-b12!= 181-b13。几天前,191-b12安全补丁刚刚问世,显然维护人员希望快速将它们发送给您。完全更新到191-b12可能需要额外的测试(好吧,显然应该进行上传)。
有几种工作方式:
apt
禁止破坏版本(如果你使用的是aptitude而不是sudo aptitude forbid-version openjdk-8-jre-headless
)。对于常规的“apt”,我没有看到类似的禁止机制,因此您可能需要使用apt pinning来防止重新安装此升级(或者您只是继续降级,我希望很快就会解决)。-Djdk.net.URLClassPath.disableClassPathURLCheck=true
)设置属性JAVA_FLAGS
也应该有所帮助。但我自己没有证实这一点。您甚至可以使用add the workaround to ~/.m2/settings.xml
轻松地为所有Maven构建启用它。正如您所看到的,错误跟踪工作,问题缩小了,并且有一个固定的软件包可用,并且很快就会出现新版本的surefire插件!
设置属性“-Djdk.net.URLClassPath.disableClassPathURLCheck = true”的上述建议对我不起作用,但设置以下内容确实可以正常工作:
-DforkCount=0
对于Ubuntu:安装最新版本,它修复了这个错误
sudo apt-get update ; sudo apt-get dist-upgrade -y
安装最后一个工作版本(没有安全补丁)没有bug。
sudo apt-get install openjdk-8-jdk-headless=8u181-b13-1 openjdk-8-jdk=8u181-b13-1 openjdk-8-jre=8u181-b13-1 openjdk-8-jre-headless=8u181-b13-1 openjdk-8-source=8u181-b13-1
如果您错过了该版本,请使用之前的版本:
sudo apt-get install openjdk-8-jdk-headless=8u162-b12-1 openjdk-8-jdk=8u162-b12-1 openjdk-8-jre=8u162-b12-1 openjdk-8-jre-headless=8u162-b12-1 openjdk-8-source=8u162-b12-1
然后使用pinning或注意你不会安装破碎的版本。
使用-Djdk.net.URLClassPath.disableClassPathURLCheck=true
并不适合我,无论我在哪里配置。在我的集成测试的某个地方,它总是在没有旧Java版本的情况下退出。
正如Erich所提到的那样,Debian软件包中的一个错误是911925过于严格,而Surefire-plugin并没有按照新规则SUREFIRE-1588行事。
我最近在Jenkins上设置了maven工作,并遇到了同样的问题。我接受了修改JAVA env变量的建议并确认问题已解决。这就是我测试的方式。
成为“jenkins”用户并将文件夹更改为您为作业设置的工作区项目名称。
$ _JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean install -U
$ lsb_release -rd
Description: Ubuntu 16.04.5 LTS
Release: 16.04
$ mvn -v
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.8.0_181, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-131-generic", arch: "amd64", family: "unix"
我卸载了存储库中的JDK:
$ sudo apt purge openjdk-8-jdk
$ sudo apt autoremove
然后我删除了JAVA_HOME
环境变量。我的.bashrc中设置了我的。
然后我通过SDKMAN重新安装它:
$ sdk install java 8.0.181-zulu
从他们的site:
SDKMAN!是一种在大多数基于Unix的系统上管理多个软件开发工具包的并行版本的工具。它提供了方便的命令行界面(CLI)和API,用于安装,切换,删除和列出候选人。
要查看要安装的其他JDK版本,请使用:
$ sdk list java
我正面临与gitlab ci相同的问题,将qvenxswpoi的maven图像改为maven:3-jdk-8
似乎解决了这个问题。顺便说一句,我也用maven:3.6.0-jdk-8-alpine
进行了测试,但它也没有用。
我已经添加了对junit-jupiter-engine的依赖,并且它有效。
maven:3.6.0-jdk-8
如果像我一样,你的管道中存在问题(对我而言,它在GitLab中,但无论如何),如果你使用的是Maven JDK 8 Docker镜像。
你可以替换
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
</dependency>
</dependencies>
</plugin>
通过最后的工作构建
image: maven:3.5.4-jdk-8
我被用作解决方法来停止编译和执行测试文件:
image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b
我找到了this workaround并修复了我的测试:配置maven-surefire-plugin
不使用系统类加载器。
将useSystemClassloader设置为false:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
如果您不是从具有为您定义的版本的父级继承(例如Spring Boot启动程序),那么您还需要定义它。
我有另一个解决方法。设置环境变量_JAVA_OPTIONS。我已经将它用于我们的TeamCity构建代理,现在我们的构建运行良好。
_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true
我发布了一个更具针对性的变体,上面的解决方法之一in JIRA。添加到~/.m2/settings.xml
:
<profile>
<id>SUREFIRE-1588</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
</properties>
</profile>
我在我的GitLab CI版本中遇到了这个问题,它使用的是maven:3.5.4-jdk-8
Docker镜像。
将其更改为maven:3.5.4-jdk-8-alpine
解决了这个问题。
我按照这个链接https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html并在pom.xml中添加了下面的插件,它工作,
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
当使用带有3.6.0-jdk-8
图像的GitLab CI / CD时,下面的属性有帮助(不修改pom.xml
)。
-Dsurefire.useSystemClassLoader=false
对于那些在GitLab CI上搜索与Docker Maven相关的答案:3.5.x-jdk-8的人,请参阅this GitHub issue。
似乎3.5.4-jdk-8
图像导致升级到一个小的Java版本,它以某种方式影响Surefire的分叉机制。
回滚到3.5.3-jdk-8
图像,在我的GitLab CI服务器上使用Surefire 2.20.1构建Java 1.8代码。