簡體   English   中英

Maven surefire 找不到 ForkedBooter 類

[英]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 說明:

  • 應用 8u191-b12 安全更新中的補丁。

請注意,191-b12 != 181-b13。 191-b12 安全補丁幾天前剛剛發布,顯然維護人員希望盡快將它們提供給您。 完全更新到 191-b12 可能需要額外的測試(好吧,顯然應該有這個上傳)。

有幾種解決方法:

  1. 你可以從 snapshots.do安裝以前的包 降級后,您可以使用sudo aptitude forbid-version openjdk-8-jre-headless禁止損壞的版本(如果您使用的是 aptitude 而不是apt )。 對於常規的“apt”,我沒有看到類似的禁止機制,因此您可能需要使用 apt 固定來防止重新安裝此升級(或者您只是繼續降級,我希望這將很快得到解決)。
  2. 根據錯誤跟蹤,使用任何常用方法(例如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.2maven: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

https://issues.apache.org/jira/browse/SUREFIRE-1703

https://issues.apache.org/jira/browse/SUREFIRE-1704

對我來說,在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM