[java] 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?

나는 실행하고있어 데비안 9 64 비트 오픈 JDK 1.8.0_181와 (스트레칭) 메이븐 내에서 구성 내 회사 프록시 뒤에 작업, 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 패키지의 수정 된 버그입니다 (업스트림 패치가 없어서 업스트림에서 크게 벗어났습니다. 보안 검사 비활성화로 되돌릴 업스트림 패치가 누락되었습니다). 그러나 그것은 확실한 Firefire 플러그인 SUREFIRE-1588버그입니다. 확실한 확실한 3.0.0-M1 : 아마도 Java가 미래에 상대 경로 이름 만 허용하는 곳에서 절대 경로를 사용하고 있습니다 (데비안은 미래 행동 이미).

패키지 버전 8u181-b13-2는 다음을 나타냅니다.

  • 8u191-b12 보안 업데이트의 패치를 적용하십시오.

191-b12! = 181-b13입니다. 192-b12 보안 패치는 며칠 전에 나 왔으며, 관리자는 빠르게 패치를 받기를 원했습니다. 191-b12로 완전히 업데이트하려면 추가 테스트가 필요할 것입니다 (물론이 업로드가 있어야합니다).

몇 가지 해결 방법이있었습니다.

  1. 대신 snapshots.do 에서 이전 패키지 설치할 수 있습니다 . 다운 그레이드 후을 사용하여 깨진 버전 (적성을 사용하고있는 경우 apt)을 금지 할 수 있습니다 sudo aptitude forbid-version openjdk-8-jre-headless. 정기적 인 “apt”의 경우 유사한 금지 메커니즘이 표시되지 않았으므로이 업그레이드가 다시 설치되지 않도록 적절한 고정 기능을 사용해야 할 수도 있습니다 (또는 계속 다운 그레이드 계속하면 곧 해결 될 것입니다).
  2. 버그 추적에 따르면 -Djdk.net.URLClassPath.disableClassPathURLCheck=true일반적인 방법 (예 :)으로 속성 을 설정하면 JAVA_FLAGS도움이됩니다. 그러나 나는 이것을 직접 확인하지 않았다. 모든 Maven 빌드에 쉽게 사용할 수 있도록 해결 방법을 추가~/.m2/settings.xml 할 수도 있습니다.

보시다시피 버그 추적이 작동 하고 문제가 좁아지고 고정 패키지가 제공되며 새로운 버전의 surefire 플러그인이 곧 제공 될 것입니다!


답변

useSystemClassloader를 false로 설정하십시오.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
</plugin>

스프링 부트 스타터와 같이 자신을 위해 정의 된 버전을 가진 부모로부터 상속받지 않으면이를 정의해야합니다.


답변

이 해결 방법을 찾고 테스트를 수정했습니다 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-8Docker 이미지를 사용하는 GitLab CI 빌드 에서이 문제가 발생했습니다 .

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>