Maven surefire 找不到 ForkedBooter class
Maven surefire could not find ForkedBooter class
最近来了一个新项目,正在尝试编译我们的源代码。昨天一切正常,但今天是另一回事了。
每次我 运行 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-bits with OpenJDK 1.8.0_181, Maven 3.5.4,在我的 ~/.m2/settings.xml
.
配置的公司代理后面工作
奇怪的是,如果我没记错的话,最新的Surefire版本是2.22.1。我试图指定插件版本,但它没有得到更新,否则任何 POM(parent、grand-parent 或这个)都没有插件版本规范。
我好不容易强制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)
我找到 并修复了我的测试:配置 maven-surefire-plugin
不使用系统类加载器。
要修复它(2018 年),请将您的 openjdk 更新到最新版本,至少 8u191-b12。如果此问题在 2020 年再次出现,则可能是openjdk 的默认行为已更改,您将需要更新 maven surefire 插件。
这是 现已修复 bug in the openjdk-8 package (behaviour deviates from upstream significantly without need; missing the upstream patch to revert back to disabling a security check) that you just upgraded to. But it is also a bug in the surefire plugin, SUREFIRE-1588, supposedly fixed in surefire 3.0.0-M1:它显然在 Java 将来会使用的地方使用绝对路径只允许相对路径名(Debian 已经激活了未来的行为)。
软件包版本 8u181-b13-2 声明:
- 应用 8u191-b12 安全更新的补丁。
注意 191-b12 != 181-b13。 191-b12 安全补丁几天前刚刚发布,显然维护人员希望尽快将它们提供给您。完全更新到 191-b12 可能需要额外的测试(好吧,显然应该有这个上传)。
有几种解决方法:
- 您可以安装 previous package from snapshots.d.o。降级后,您可以使用
sudo aptitude forbid-version openjdk-8-jre-headless
禁止损坏的版本(如果您使用的是 aptitude 而不是 apt
)。对于常规 "apt" 我没有看到类似的禁止机制,所以你可能需要使用 apt pinning 来防止重新安装此升级(或者你只是继续降级,我希望这会尽快解决) .
- 根据错误跟踪,使用任何常用方法(例如,
JAVA_FLAGS
)设置 属性 -Djdk.net.URLClassPath.disableClassPathURLCheck=true
应该也会有所帮助。但是我自己没有验证过。您甚至可以 add the workaround to ~/.m2/settings.xml
轻松地为所有 Maven 构建启用它。
如您所见,错误跟踪有效,问题范围缩小,修复包可用,新版本的 surefire 插件即将推出!
我在使用 maven:3.5.4-jdk-8
Docker 图像的 GitLab CI 构建中遇到了这个问题。
将其更改为 maven:3.5.4-jdk-8-alpine
解决了问题。
对于那些在 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 服务器构建 Java 1.8 代码和 Surefire 2.20.1 上为我修复了这个问题。
如果你像我一样在管道中遇到问题(对我来说它在 GitLab 中,但无论如何)并且如果你使用的是 Maven JDK 8 Docker 图像。
你可以替换
image: maven:3.5.4-jdk-8
由最后一个工作构建
image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b
我有另一个解决方法。设置环境变量 _JAVA_OPTIONS。我已经将其用于我们的 TeamCity 构建代理,现在我们的构建 运行 很好。
_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true
将 useSystemClassloader 设置为 false:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
如果您不是从为您定义了版本的父级继承(例如 Spring 引导启动程序),您也需要定义它。
上面关于设置 属性 "-Djdk.net.URLClassPath.disableClassPathURLCheck=true" 的建议对我不起作用,但设置以下内容确实有效:
-DforkCount=0
我发布了上述解决方法之一的更有针对性的变体 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>
我按照这个 link 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>
对于Ubuntu:安装最新版本,已修复此错误
sudo apt-get update ; sudo apt-get dist-upgrade -y
安装没有错误的最后一个工作版本(没有安全补丁)。
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 版本的情况下退出。
如 it's a bug in the Debian package being too strict 911925 and the Surefire-plugin not acting according to the new rules SUREFIRE-1588所述。
我卸载了存储库中的 JDK:
$ sudo apt purge openjdk-8-jdk
$ sudo apt autoremove
然后我删除了JAVA_HOME
环境变量。我的设置在我的 .bashrc.
然后我通过SDKMAN重新安装了:
$ sdk install java 8.0.181-zulu
来自他们的site:
SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It provides a convenient Command Line Interface (CLI) and API for installing, switching, removing and listing Candidates.
要查看其他版本的 JDK 安装,请使用:
$ sdk list java
我最近在 Jenkins 上设置了 maven 作业,但遇到了同样的问题。我采纳了修改 JAVA 环境变量的建议并确认问题已解决。我就是这样测试的。
成为 "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"
我遇到了与 gitlab ci 相同的问题ci,将 Maven 图像从 maven:3-jdk-8
更改为 maven:3.6.0-jdk-8-alpine
似乎解决了这个问题。顺便说一句,我也用 maven:3.6.0-jdk-8
进行了测试,但它也没有用。
将 GitLab CI/CD 与 3.6.0-jdk-8
图像一起使用时,只有下面的 属性 有帮助(无需修改 pom.xml
)。
-Dsurefire.useSystemClassLoader=false
我已经添加了对 junit-jupiter-engine 的依赖,它起作用了。
<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>
将此添加到 maven-surefire-plugin 我解决了问题:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
surefire - v2.22.2
和 maven:3.6-jdk-8-alpine
仍然是个问题。要解决此问题,请将以下代码添加到 pom.xml
(作为 maven 插件)
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
...
基本上是 JDK 版本和 maven-surefire 插件版本之间的不兼容,在我的情况下,JDK 11.0.5 不适用于 surefire 3.0.0-M4,我不得不切换到 3.0.0-M3 就可以了。将 forkCount 设置为 0 并不能解决问题,因为它破坏了 Jacoco 报告。
对我来说,在Visual Studio代码
我没有在 pom.xml 文件中做任何更改或更新任何依赖版本
将此行添加到 settings.json
of Visual Studio 代码解决了问题。
"maven.executable.options": "-DforkCount=0",
最近来了一个新项目,正在尝试编译我们的源代码。昨天一切正常,但今天是另一回事了。
每次我 运行 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-bits with OpenJDK 1.8.0_181, Maven 3.5.4,在我的 ~/.m2/settings.xml
.
奇怪的是,如果我没记错的话,最新的Surefire版本是2.22.1。我试图指定插件版本,但它没有得到更新,否则任何 POM(parent、grand-parent 或这个)都没有插件版本规范。
我好不容易强制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)
我找到 maven-surefire-plugin
不使用系统类加载器。
要修复它(2018 年),请将您的 openjdk 更新到最新版本,至少 8u191-b12。如果此问题在 2020 年再次出现,则可能是openjdk 的默认行为已更改,您将需要更新 maven surefire 插件。
这是 现已修复 bug in the openjdk-8 package (behaviour deviates from upstream significantly without need; missing the upstream patch to revert back to disabling a security check) that you just upgraded to. But it is also a bug in the surefire plugin, SUREFIRE-1588, supposedly fixed in surefire 3.0.0-M1:它显然在 Java 将来会使用的地方使用绝对路径只允许相对路径名(Debian 已经激活了未来的行为)。
软件包版本 8u181-b13-2 声明:
- 应用 8u191-b12 安全更新的补丁。
注意 191-b12 != 181-b13。 191-b12 安全补丁几天前刚刚发布,显然维护人员希望尽快将它们提供给您。完全更新到 191-b12 可能需要额外的测试(好吧,显然应该有这个上传)。
有几种解决方法:
- 您可以安装 previous package from snapshots.d.o。降级后,您可以使用
sudo aptitude forbid-version openjdk-8-jre-headless
禁止损坏的版本(如果您使用的是 aptitude 而不是apt
)。对于常规 "apt" 我没有看到类似的禁止机制,所以你可能需要使用 apt pinning 来防止重新安装此升级(或者你只是继续降级,我希望这会尽快解决) . - 根据错误跟踪,使用任何常用方法(例如,
JAVA_FLAGS
)设置 属性-Djdk.net.URLClassPath.disableClassPathURLCheck=true
应该也会有所帮助。但是我自己没有验证过。您甚至可以 add the workaround to~/.m2/settings.xml
轻松地为所有 Maven 构建启用它。
如您所见,错误跟踪有效,问题范围缩小,修复包可用,新版本的 surefire 插件即将推出!
我在使用 maven:3.5.4-jdk-8
Docker 图像的 GitLab CI 构建中遇到了这个问题。
将其更改为 maven:3.5.4-jdk-8-alpine
解决了问题。
对于那些在 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 服务器构建 Java 1.8 代码和 Surefire 2.20.1 上为我修复了这个问题。
如果你像我一样在管道中遇到问题(对我来说它在 GitLab 中,但无论如何)并且如果你使用的是 Maven JDK 8 Docker 图像。
你可以替换
image: maven:3.5.4-jdk-8
由最后一个工作构建
image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b
我有另一个解决方法。设置环境变量 _JAVA_OPTIONS。我已经将其用于我们的 TeamCity 构建代理,现在我们的构建 运行 很好。
_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true
将 useSystemClassloader 设置为 false:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
如果您不是从为您定义了版本的父级继承(例如 Spring 引导启动程序),您也需要定义它。
上面关于设置 属性 "-Djdk.net.URLClassPath.disableClassPathURLCheck=true" 的建议对我不起作用,但设置以下内容确实有效:
-DforkCount=0
我发布了上述解决方法之一的更有针对性的变体 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>
我按照这个 link 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>
对于Ubuntu:安装最新版本,已修复此错误
sudo apt-get update ; sudo apt-get dist-upgrade -y
安装没有错误的最后一个工作版本(没有安全补丁)。
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 版本的情况下退出。
如
我卸载了存储库中的 JDK:
$ sudo apt purge openjdk-8-jdk
$ sudo apt autoremove
然后我删除了JAVA_HOME
环境变量。我的设置在我的 .bashrc.
然后我通过SDKMAN重新安装了:
$ sdk install java 8.0.181-zulu
来自他们的site:
SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It provides a convenient Command Line Interface (CLI) and API for installing, switching, removing and listing Candidates.
要查看其他版本的 JDK 安装,请使用:
$ sdk list java
我最近在 Jenkins 上设置了 maven 作业,但遇到了同样的问题。我采纳了修改 JAVA 环境变量的建议并确认问题已解决。我就是这样测试的。
成为 "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"
我遇到了与 gitlab ci 相同的问题ci,将 Maven 图像从 maven:3-jdk-8
更改为 maven:3.6.0-jdk-8-alpine
似乎解决了这个问题。顺便说一句,我也用 maven:3.6.0-jdk-8
进行了测试,但它也没有用。
将 GitLab CI/CD 与 3.6.0-jdk-8
图像一起使用时,只有下面的 属性 有帮助(无需修改 pom.xml
)。
-Dsurefire.useSystemClassLoader=false
我已经添加了对 junit-jupiter-engine 的依赖,它起作用了。
<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>
将此添加到 maven-surefire-plugin 我解决了问题:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
surefire - v2.22.2
和 maven:3.6-jdk-8-alpine
仍然是个问题。要解决此问题,请将以下代码添加到 pom.xml
(作为 maven 插件)
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
...
基本上是 JDK 版本和 maven-surefire 插件版本之间的不兼容,在我的情况下,JDK 11.0.5 不适用于 surefire 3.0.0-M4,我不得不切换到 3.0.0-M3 就可以了。将 forkCount 设置为 0 并不能解决问题,因为它破坏了 Jacoco 报告。
对我来说,在Visual Studio代码
我没有在 pom.xml 文件中做任何更改或更新任何依赖版本
将此行添加到 settings.json
of Visual Studio 代码解决了问题。
"maven.executable.options": "-DforkCount=0",