最近新しいプロジェクトに来て、私は私達のソースコードをコンパイルしようとしています。昨日はすべてうまくいったが、今日は別の話だ。
モジュールに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)
(2018年に)修正するには、openjdkを最新のバージョン、少なくとも8u191-b12に更新してください。 2020年にこの問題が再発した場合、openjdkのデフォルトの振る舞いが変更された可能性が高いので、maven surefireプラグインを更新する必要があります。
これは 修正されました openjdk-8パッケージのバグ(ふるまいは必要なく上流から逸脱しています;上流のパッチを見逃してセキュリティを無効に戻しましたアップグレードしたことを確認してください。しかし、それはまた a surefireプラグインのバグ、SUREFIRE-1588 、確かにsurefire 3.0.0-M1で修正されています :それは明らかにJavaが入る場所で絶対パスを使っています将来は相対パス名のみを許可します(そしてDebianはすでに将来の動作を有効にしました)。
パッケージバージョン8u181-b13-2には、次のように記載されています。
191 − b12!= 181 − b13であることに留意されたい。 191-b12セキュリティパッチはほんの数日前に公開された、そして明らかにメンテナはあなたに早くそれらを届けることを望んだ。 191-b12に完全に更新するには、おそらく追加のテストが必要になります(そうですね、このアップロードもあるはずです)。
いくつかの回避策がありました。
Sudo aptitude forbid-version openjdk-8-jre-headless
を使用して破損したバージョンを禁止することができます(apt
ではなくaptitudeを使用している場合)。通常の "apt"の場合、私は似たような禁じられたメカニズムを見ませんでした。このアップグレードが再インストールされるのを防ぐためにapt pinningを使う必要があるでしょう。-Djdk.net.URLClassPath.disableClassPathURLCheck=true
など)のいずれかを使用してプロパティJava_FLAGS
を設定することも役に立ちます。しかし、私はこれを自分で検証していません。あなたのMavenのすべてのビルドで簡単に有効にするために、 ~/.m2/settings.xml
回避策を追加することさえ可能です。ご覧のとおり、 バグ追跡が機能しています 、問題が絞り込まれ、修正済みのパッケージが利用可能になり、新しいバージョンのsurefireプラグインが近日中に登場する予定です。
この回避策 を見つけて、私のテストを修正しました。システムクラスローダを使わないようにmaven-surefire-plugin
を設定します。
UseSystemClassloaderをfalseに設定します。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
あなたが定義したバージョン(Spring Bootスターターなど)を持つ親から継承していないのなら、それも定義する必要があります。
別の回避策があります。環境変数_Java_OPTIONSを設定します。私はこれを私たちのTeamCityビルドエージェントのために使いました、そして今私たちのビルドはうまく動きます。
_Java_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true
私は上記の回避策の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>
この問題は、maven:3.5.4-jdk-8
Dockerイメージを使用していた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>
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 。
"-Djdk.net.URLClassPath.disableClassPathURLCheck = true" に設定するという上記の提案はうまくいきませんでした。
-DforkCount=0
GitLab CI/CDを3.6.0-jdk-8
imageと共に使用する場合、以下のプロパティのみが役に立ちました(pom.xml
を変更せずに)。
-Dsurefire.useSystemClassLoader=false
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サーバーでこれが修正されました。
私は最近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>
リポジトリに入っている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
私はgitlab ciで同じ問題に直面していました、mavenのイメージをmaven:3-jdk-8
からmaven:3.6.0-jdk-8-Alpine
に変更すると問題が解決するようです。ところで私はmaven:3.6.0-jdk-8
でもテストしましたが、どちらもうまくいきませんでした。