Maven surefireはForkedBooterクラスを見つけることができませんでした


217

最近新しいプロジェクトに来て、私はソースコードをコンパイルしようとしています。昨日はすべてうまくいきましたが、今日はまた別の話です。

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を使用して64ビットのDebian 9(Stretch)で実行しており、で設定した会社のプロキシの背後で動作しています。~/.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)

1
私はこのバグをclircle-ciで抱えています。Surefireフォークとフォークされたvmは、次のメッセージを出力して終了します。「エラー:メインクラスorg.apache.maven.surefire.booter.ForkedBooterが見つからないか、ロードできませんでした」。マッサージはtarget / surefire-reports / *。dumpstreamにあります。-Xを指定してmavenを実行すると、コマンドラインが出力されます。試してみると、vmがこのメッセージを出力しているのを確認できます。
Bruno Coutinho


私の解決策は、任意のバージョンのopen-jdksの使用を停止することでした。非常に基礎的なものでは、この種の信頼性を損なうことはできません。
エイドリアンM.

mavenのdependencyManagementセクションを使用して、プラグインのさまざまなバージョンを指定します
jogaco

Debianでjdk 11に更新することは、私にとって確実な解決策でした!
クリアライト

回答:


251

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

これはだった今、固定 OpenJDKの-8パッケージのバグ(なくても行動ずれ上流から大幅に、セキュリティチェックを無効に戻す上流のパッチが欠けて)あなただけにアップグレードすることを。しかし、確実なプラグインであるSUREFIRE-1588のバグであります。確実に3.0.0-M1で修正されました。将来的にJavaが相対パス名のみを許可する場所で絶対パスを使用しているようです(Debianは将来の行動はすでに)。

パッケージバージョン8u181-b13-2には次のように記載されています。

  • 8u191-b12セキュリティアップデートからパッチを適用します。

191-b12!= 181-b13であることに注意してください。191-b12のセキュリティパッチはほんの数日前にリリースされました。どうやらメンテナはそれらを迅速に提供したいと考えていました。完全に191-b12に更新するには、追加のテストが必要になる可能性があります(まあ、明らかにこのアップロードが必要です)。

いくつかの回避策がありました:

  1. 代わりに、snapshots.doから以前のパッケージをインストールできます。ダウングレードした後、(aptitudeを使用していてaptitudeを使用していない場合apt)を使用して、壊れたバージョンを禁止できますsudo aptitude forbid-version openjdk-8-jre-headless。通常の「apt」の場合、同様の禁止メカニズムが見当たらないため、このアップグレードが再インストールされないようにapt pinningを使用する必要がある可能性があります(または、再度ダウングレードを続行します。これはすぐに解決されると思います)。
  2. バグ追跡によると-Djdk.net.URLClassPath.disableClassPathURLCheck=true、通常の方法(などJAVA_FLAGS)でプロパティを設定することも役立つはずです。しかし、私はこれを自分で確認していません。あなたは明らかにさえすることができますに回避策を追加し~/.m2/settings.xml、すべてのあなたのMavenを簡単に構築するためにそれを有効に取得します。

ご覧のとおり、バグ追跡が機能し、問題が絞り込まれました。修正済みパッケージが利用可能で、新しいバージョンのsurefireプラグインがまもなく登場します!


@AdrianMadarasこれまでに新しいアップデートは入手できませんでした。-2バージョンのみです。また、修正されたアップロードの発表はまだありませんでしたが、進行中です。おそらく、問題のある既知のバージョンに再アップグレードしただけでしょう。
Erich Schubert

1
OpenJDK 10.0.2を使用してUbuntu 18.04で同じ問題が発生しました。JAVA_HOMEを「java-9-oracle」インストールに切り替えると修正されました。
RobAu 2018年

2
surefire-maven-pluginの課題追跡での対応する問題は次のとおりです。issues.apache.org/ jira / browse / SUREFIRE- 1588(これは、関連するOpenJDKの変更のCanonical / Debianバックポートのバグです)。
mirabilos

1
回避策1.問題が発生しているバージョンであるため、私には意味がありません。maven-surefire-pluginをオーバーライドしてuseSystemClassLoaderを使用しないようにすることもできませんでした
Edwin Diaz-Mendez

1
surefire 3.0.0-M1へのアップグレードも試すことができます。しかし、2〜3マイルストーンバージョンは、もちろん他のものを壊す可能性があります。
Erich Schubert

54

useSystemClassloaderをfalseに設定します。

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

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


プラグインプロセスでテストを実行しているため、システムクラスローダーを有効にするのは最悪の方法です。正しい方法は、すべてのプラグインのバージョンをアップグレードすることです。Maven 3.7.0は、デフォルトのライフサイクルに属するすべてのプラグインのバージョンをアップグレードします。Springは古いバージョンに固執したり、それらをオーバーライドしたりしてはなりません。これは、責任において不必要な対立を引き起こします。
tibor17

52

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


maven-surefire-pluginのメンテナーによると、すべての回避策(これ、forkCount0に設定、またはargLineグローバルに設定)には問題があり、普遍的に適用することはできません。
mirabilos

良い発見。ただし、実際の回避策のテキストを投稿に含めるか、少なくともリンクをStackoverflowリンクとして明確に識別してください。つまり、@ markoornが使用するアプローチの方が便利です。
nealmcb

38

別の回避策があります。環境変数_JAVA_OPTIONSを設定します。これをTeamCityビルドエージェントに使用しましたが、ビルドは正常に実行されます。

_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true

セキュリティ修正は通常、理由もなく導入されていないとして標識され、誰かがちょうどコト...それを無効にする方法をSOに伝えますので、互換性に影響する変更
berezovskyi

26

上記の回避策のいずれかのよりターゲットを絞ったバリアントをJIRAに投稿しました。追加~/.m2/settings.xml

<profile>
    <id>SUREFIRE-1588</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
    </properties>
</profile>

これは次の警告で失敗します:[WARNING] Expected root element 'settings' but found 'profile' (position: START_TAG seen <profile>... @1:9) @ /home/nikolai/.m2/settings.xml, line 1, column 9
Nikolai

3
@Nikolai上記のスニペットはで囲む必要があります<settings><profiles>...</profiles></settings>
qqx 2018年

13

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

それを変更してmaven:3.5.4-jdk-8-alpine問題を修正しました。


8

私はこのリンク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>

8

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

-Dsurefire.useSystemClassLoader=false

これもまた悪い習慣です。正しいのは、バージョンをアップグレードすることです。常にMaven Centralでバージョンを確認してください。
tibor17

5

GitLab CIのDocker Maven:3.5.x-jdk-8に関連する回答を探している方は、このGitHubの問題を参照してください

それが表示されます 3.5.4-jdk-8画像は、何とかシュアのフォークメカニズムに影響を与えマイナーJavaバージョンへのアップグレードが生じました。

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


5

上記のプロパティ「-Djdk.net.URLClassPath.disableClassPathURLCheck = true」を設定するという提案は機能しませんでしたが、次の設定は機能します。

-DforkCount=0

2
これには、テストを実行するための新しいVMを作成しないという効果があるため、テストがメインビルドVMに影響を与える可能性があります。
パウロEbermann

4

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に従って動作しない。


なぜ誰もがセキュリティパッチなしのバージョンをインストールすることを勧めるのですか?他の提案にはテストのスキップが含まれますが、ハァッ。
berezovskyi

1
もう必要はありません:-)修正されました。しかし、当面は、私が取り組む必要のある多くのJavaプロジェクトがあり、Javaランタイムは外部からの新しいコードにどこにもさらされていませんでした。だから、私にとっては大丈夫だった監督可能なリスクがありました。結局のところ、それは誰もが自分で決めることです:-)
flob '11

実際、あなたの言う通り、JDKの開発者はデフォルトで設定されたプロップに戻ってきたことがわかりました。しかし、メジャーバージョンを確実にアップグレードすることは、実際には私にとって最良の修正とは思えません。
berezovskyi

1
絶対に!しかし、彼らがしなければならなかった変更は、コードベース全体を通して行われ、非常に侵襲的です。そのため、この修正のマイナーバージョンの変更は、確実に選択できません。
flob 2018年

1
残念ながら、2.xは廃止されており、後で切り替える必要があります。issues.apache.org
browse

2

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>

このジュピタープラグインが行うブラックマジックは何ですか?これは私のために働いた!賛成投票!:-)
Hinotori

1

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

1

これをmaven-surefire-pluginに追加して問題を解決しました:

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

1

基本的に、JDKバージョンとmaven-surefireプラグインバージョン間の非互換性です。私の場合、JDK 11.0.5はsurefire 3.0.0-M4では機能しません。3.0.0-M3に切り替えなければならず、機能しました。forkCountを0に設定しても、Jacocoレポートが壊れるため、問題は解決しません。


0

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

$ sudo apt purge openjdk-8-jdk

$ sudo apt autoremove

次に、JAVA_HOME環境変数を削除しました。私の.bashrcに鉱山が設置されました。

次に、SDKMANを使用して再インストールしました。

$ sdk install java 8.0.181-zulu

彼らのサイトから:

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

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

$ sdk list java

0

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


0

それはまだのための問題だsurefire - v2.22.2maven:3.6-jdk-8-alpine。この問題を修正するには、以下のコードをpom.xml(mavenプラグインとして)追加します

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

-1

私のような場合、パイプラインに問題があり(私にとってはGitLabにありますが、何でも)、Maven JDK 8 Dockerイメージを使用している場合。

交換できます

image: maven:3.5.4-jdk-8

最後の作業ビルドまで

image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b

1
問題は、debianの最新のjdk8に由来します。私の意見では、コアの問題を「修正」することは、回避するよりも優れていると思います。
シロディス2018年

sha256サウンドはトリッキーで怖いですか?実際、他の回答は回避策に似ています。surefireの一部の機能を無効にします。ここでは、回避策である作業中のpomまたはパイプラインを変更せずに、最後に機能しているDockerイメージを使用します。
amdev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.