programing

Maven surefire가 ForkedBooter 클래스를 찾을 수 없음

prostudy 2022. 7. 24. 21:15
반응형

Maven surefire가 ForkedBooter 클래스를 찾을 수 없음

최근에 새로운 프로젝트에 와서 소스코드를 컴파일하려고 합니다.어제는 모든 것이 잘 풀렸지만 오늘은 다른 이야기다.

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?

OpenJDK 1.8.0_181, Maven 3.5.4를 탑재한 Debian 9(Stretch) 64비트로 실행하고 있으며, 자신의 PC에서 설정한 회사 프록시 뒤에서 작업하고 있습니다.~/.m2/settings.xml.

이상한 것은 최신 Surefire 버전이 2.22.1이라는 것입니다.플러그인 버전을 지정하려고 했지만 업데이트가 되지 않습니다.그렇지 않으면 POM(부모, 조부모 또는 이 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.d.o에서 이전 패키지를 설치할 수 있습니다.다운그레이드 후 파손된 버전을 금지할 수 있습니다(적성을 사용하고 있고 그렇지 않은 경우).apt를 사용하여 를 참조해 주세요.sudo aptitude forbid-version openjdk-8-jre-headless통상적인 「적합」의 경우는, 같은 금지 메카니즘은 보이지 않기 때문에, 이 업그레이드를 재인스톨 하는 것을 막기 위해서 적절한 핀 접속을 사용할 필요가 있을 가능성이 있습니다(혹은 다운그레이드를 계속하고 있기 때문에, 빨리 해결되기를 바랍니다).
  2. 트래킹에 " " " "-Djdk.net.URLClassPath.disableClassPathURLCheck=true예: 「」)을 사용해 .JAVA_FLAGS)도 도움이 됩니다.하지만 나는 이것을 스스로 검증하지 않았다.회피책을 추가하여 모든 Maven 빌드에서 쉽게 사용할 수 있도록 할 수도 있습니다.

보시는 바와 같이 버그 트래킹이 기능하여 문제가 좁혀지고 수정 패키지가 제공되며 새로운 버전의 Surefire 플러그인이 곧 출시됩니다!

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를 설정합니다. 팀시티 빌드 에이전트에 이 변수를 사용했으며 이제 빌드도 정상적으로 실행됩니다.

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

GitLab CI를 에서 이 했습니다.maven:3.5.4-jdk-8도커 이미지

★★★★★★★★★★★★★★★★로 변경maven:3.5.4-jdk-8-alpine문제를 해결했습니다.

GitLab CI/CD와 함께 CI/3.6.0-jdk-8helped (')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이미지는 Surefire의 포킹 메커니즘에 영향을 미치는 마이너 Java 버전으로 업그레이드되었습니다.

「 」로 .3.5.3-jdk-8Surefire 2.20.1 Java 1.8 GitLab CI입니다.

"-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 플러그인이 새로운 규칙에 따라 동작하지 않는 것입니다.

Junit-Jupiter 엔진에 의존성을 더했고, 작동했어요.

<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-sure-fire 플러그인에 추가하여 문제를 해결했습니다.

    <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(메이븐 플러그인으로)

...
<plugin>    
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId>  
    <configuration>
        <forkCount>0</forkCount>
    </configuration>
</plugin>
...

나는 최근에 젠킨스를 고용했다가 같은 문제에 처하게 되었다.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-M4에서는 동작하지 않습니다.Surefire 3.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

사이트:

SDKMAN!은 대부분의 Unix 기반 시스템에서 여러 소프트웨어 개발 키트의 병렬 버전을 관리하기 위한 도구입니다.Command Line Interface(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둘 다 효과가 없었어요.

저는 Visual Studio Code에서

pom.xml 파일을 변경하거나 종속 버전을 업데이트하지 않았습니다.
이 행을 에 추가하다settings.jsonVisual Studio Code (비주얼 스튜디오 코드)

"maven.executable.options": "-DforkCount=0",

저처럼 파이프라인에 문제가 있거나(저는 GitLab에 있지만), Maven JDK 8 Docker 이미지를 사용하고 있다면 문제가 있습니다.

교환할 수 있습니다.

image: maven:3.5.4-jdk-8

마지막 동작 시까지.

image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b

언급URL : https://stackoverflow.com/questions/53010200/maven-surefire-could-not-find-forkedbooter-class

반응형