web-dev-qa-db-ja.com

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?

私は Debian 9 (Stretch)64ビットの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)
203
Sylordis

(2018年に)修正するには、openjdkを最新のバージョン、少なくとも8u191-b12に更新してください。 2020年にこの問題が再発した場合、openjdkのデフォルトの振る舞いが変更された可能性が高いので、maven surefireプラグインを更新する必要があります。

これは 修正されました openjdk-8パッケージのバグ(ふるまいは必要なく上流から逸脱しています;上流のパッチを見逃してセキュリティを無効に戻しましたアップグレードしたことを確認してください。しかし、それはまた a 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から をインストールできます。ダウングレード後は、Sudo aptitude forbid-version openjdk-8-jre-headlessを使用して破損したバージョンを禁止することができます(aptではなくaptitudeを使用している場合)。通常の "apt"の場合、私は似たような禁じられたメカニズムを見ませんでした。このアップグレードが再インストールされるのを防ぐためにapt pinningを使う必要があるでしょう。
  2. バグの追跡によると、通常の方法(-Djdk.net.URLClassPath.disableClassPathURLCheck=trueなど)のいずれかを使用してプロパティJava_FLAGSを設定することも役に立ちます。しかし、私はこれを自分で検証していません。あなたのMavenのすべてのビルドで簡単に有効にするために、 ~/.m2/settings.xml 回避策を追加することさえ可能です。

ご覧のとおり、 バグ追跡が機能しています 、問題が絞り込まれ、修正済みのパッケージが利用可能になり、新しいバージョンのsurefireプラグインが近日中に登場する予定です。

228
Erich Schubert

この回避策 を見つけて、私のテストを修正しました。システムクラスローダを使わないようにmaven-surefire-pluginを設定します。

47
user3090935

UseSystemClassloaderをfalseに設定します。

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

あなたが定義したバージョン(Spring Bootスターターなど)を持つ親から継承していないのなら、それも定義する必要があります。

44
Markoorn

別の回避策があります。環境変数_Java_OPTIONSを設定します。私はこれを私たちのTeamCityビルドエージェントのために使いました、そして今私たちのビルドはうまく動きます。

_Java_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true
36
Michael

私は上記の回避策の1つのよりターゲットを絞った変種 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>
25
Jesse Glick

この問題は、maven:3.5.4-jdk-8 Dockerイメージを使用していたGitLab CIビルドで発生しました。

これをmaven:3.5.4-jdk-8-Alpineに変更すると問題が解決しました。

8
brunobastosg

私はこのリンクをたどって 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>
7

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なしで終了しました。

Erich で述べられているように、これはDebianパッケージが厳しすぎる 911925 そしてSurefireプラグインが新しい規則に従って動作していないというバグです SUREFIRE-1588

4
flob

"-Djdk.net.URLClassPath.disableClassPathURLCheck = true" に設定するという上記の提案はうまくいきませんでした。

-DforkCount=0
4
farid g.

GitLab CI/CDを3.6.0-jdk-8 imageと共に使用する場合、以下のプロパティのみが役に立ちました(pom.xmlを変更せずに)。

-Dsurefire.useSystemClassLoader=false
4
Grzes

GitLab CIでDocker Maven:3.5.x-jdk-8に関連した回答を探している人は、 このGitHub issue を見てください。

3.5.4-jdk-8イメージがマイナーなJavaバージョンへのアップグレードをもたらしたようで、それはどういうわけかSurefireのフォークメカニズムに影響を与えます。

3.5.3-jdk-8 imageにロールバックすると、Surefire 2.20.1を使ってJava 1.8コードをビルドする私のGitLab CIサーバーでこれが修正されました。

4
Simon Diemert

私は最近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"

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>
0
Adi Baboianu

リポジトリに入っているJDKをアンインストールしました。

$ Sudo apt purge openjdk-8-jdk

$ Sudo apt autoremove

それから私はJava_HOME環境変数を削除しました。私の.bashrcに設定されています。

それから私はSDKMANを通してそれを再インストールしました:

$ sdk install Java 8.0.181-zulu

site :から

SDKMAN!ほとんどのUnixベースのシステム上で複数のソフトウェア開発キットの並列バージョンを管理するためのツールです。候補のインストール、切り替え、削除、一覧表示に便利なコマンドラインインタフェース(CLI)とAPIを提供します。

インストールするJDKの他のバージョンを確認するには、次のコマンドを使用します。

$ sdk list Java
0
jumpnett

私はgitlab ciで同じ問題に直面していました、mavenのイメージをmaven:3-jdk-8からmaven:3.6.0-jdk-8-Alpineに変更すると問題が解決するようです。ところで私はmaven:3.6.0-jdk-8でもテストしましたが、どちらもうまくいきませんでした。

0
mndeveci