[英]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 位和 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 插件。
這是您剛剛升級到的 openjdk-8 包中的一個現已修復的錯誤(行為明顯偏離上游而無需;缺少上游補丁以恢復禁用安全檢查)。 但它也是surefire插件中的一個錯誤, SUREFIRE-1588 ,據說在surefire 3.0.0-M1中修復:它顯然在Java將來只允許相對路徑名的地方使用絕對路徑(並且Debian激活了未來的行為已經)。
軟件包版本 8u181-b13-2 說明:
請注意,191-b12 != 181-b13。 191-b12 安全補丁幾天前剛剛發布,顯然維護人員希望盡快將它們提供給您。 完全更新到 191-b12 可能需要額外的測試(好吧,顯然應該有這個上傳)。
有幾種解決方法:
sudo aptitude forbid-version openjdk-8-jre-headless
禁止損壞的版本(如果您使用的是 aptitude 而不是apt
)。 對於常規的“apt”,我沒有看到類似的禁止機制,因此您可能需要使用 apt 固定來防止重新安裝此升級(或者您只是繼續降級,我希望這將很快得到解決)。JAVA_FLAGS
)設置屬性-Djdk.net.URLClassPath.disableClassPathURLCheck=true
也應該有所幫助。 但我自己沒有驗證過。 顯然,您甚至可以將變通方法添加到~/.m2/settings.xml
以輕松地為您的所有 Maven 構建啟用它。如您所見,錯誤跟蹤有效,問題已縮小,並且有一個固定包可用,新版本的萬無一失插件即將推出!
將 useSystemClassloader 設置為 false:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
如果您不是從為您定義了版本的父級(例如 Spring Boot starter)繼承,您還需要定義它。
我找到了這個解決方法並修復了我的測試:配置maven-surefire-plugin
不使用系統類加載器。
我有另一種解決方法。 設置環境變量_JAVA_OPTIONS。 我已經將它用於我們的 TeamCity 構建代理,現在我們的構建運行良好。
_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true
我在 JIRA 中發布了上述解決方法之一的更有針對性的變體。 添加到~/.m2/settings.xml
:
<profile>
<id>SUREFIRE-1588</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
</properties>
</profile>
我在使用maven:3.5.4-jdk-8
Docker 鏡像的 GitLab CI 構建中遇到了這個問題。
將其更改為maven:3.5.4-jdk-8-alpine
解決了問題。
當使用帶有3.6.0-jdk-8
圖像的 GitLab CI/CD 時,只有下面的屬性有幫助(不修改pom.xml
)。
-Dsurefire.useSystemClassLoader=false
我按照這個鏈接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>
對於那些在 GitLab CI 上搜索與 Docker Maven:3.5.x-jdk-8 相關的答案的人,請參閱此 GitHub 問題。
似乎3.5.4-jdk-8
映像導致升級到 Java 次要版本,這在某種程度上影響了 Surefire 的分叉機制。
在使用 Surefire 2.20.1 構建 Java 1.8 代碼的 GitLab CI 服務器上,回滾到3.5.3-jdk-8
映像為我解決了這個問題。
上面設置屬性“-Djdk.net.URLClassPath.disableClassPathURLCheck=true”的建議對我不起作用,但設置以下內容確實可以:
-DforkCount=0
對於 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
然后使用固定或注意您不會安裝損壞的版本。
在我放置該配置的任何地方使用-Djdk.net.URLClassPath.disableClassPathURLCheck=true
對我不起作用。 在我的集成測試中,它總是在沒有舊 Java 版本的情況下退出。
正如Erich所提到的,這是 Debian 軟件包中的一個錯誤911925和 Surefire-plugin 沒有根據新規則SUREFIRE-1588 運行。
我已經添加了對 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
surefire - v2.22.2
,這仍然是一個問題。 要解決此問題,請將以下代碼添加到pom.xml
(作為 maven 插件)
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
...
我最近在 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 版本和 maven-surefire 插件版本之間的不兼容,就我而言,JDK 11.0.5 不能與 surefire 3.0.0-M4 一起使用,我不得不切換到 3.0.0-M3 並且它起作用了。 將 forkCount 設置為 0 並不能解決問題,因為它破壞了 Jacoco 報告。
我卸載了存儲庫中的 JDK:
$ sudo apt purge openjdk-8-jdk
$ sudo apt autoremove
然后我刪除了JAVA_HOME
環境變量。 我的設置在我的 .bashrc 中。
然后我通過SDKMAN重新安裝了它:
$ sdk install java 8.0.181-zulu
從他們的網站:
斯凱曼! 是在大多數基於 Unix 的系統上管理多個軟件開發工具包的並行版本的工具。 它提供了一個方便的命令行界面 (CLI) 和 API,用於安裝、切換、刪除和列出候選者。
要查看要安裝的其他 JDK 版本,請使用:
$ sdk list java
我在 gitlab ci 上遇到了同樣的問題,將 maven 圖像從maven:3-jdk-8
更改為maven:3.6.0-jdk-8-alpine
似乎解決了這個問題。 順便說一句,我也用maven:3.6.0-jdk-8
進行了測試,但它也不起作用。
我們找到了根本原因,並在3.0.0-M4和3.0.0-SNAPSHOT版本中解決了Linux Alpine的問題:
https://issues.apache.org/jira/browse/SUREFIRE-1702
對我來說,在 Visual Studio Code 中
我沒有對 pom.xml 文件做任何更改或更新任何依賴版本
將此行添加到 Visual Studio Code 的settings.json
解決了問題。
"maven.executable.options": "-DforkCount=0",
如果像我一樣,您的管道中有問題(對我來說,它在 GitLab 中,但無論如何),並且您使用的是 Maven JDK 8 Docker 映像。
你可以更換
image: maven:3.5.4-jdk-8
通過最后一個工作構建
image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b
我以此為替代方法來停止測試文件的編譯和執行:
-Dmaven.test.skip=true with maven
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.