Spring Boot 2.0.2.RELEASEアプリケーション(Web依存関係を持つWeb初期化プログラムによって生成された)のmaven(3.5.2)ビルドの実行に失敗しましたmaven-surefire-pluginただ:
Error:メインクラスorg.Apache.maven.surefire.booter.ForkedBooterが見つからないか、読み込めませんでした。
原因:Java.lang .ClassNotFoundException:org.Apache.maven.surefire.booter .ForkedBooter
なんでこんなことが起こっているの?それはboot + surefire統合=バグの問題ですか?
参考のために、関連性があると思われる依存関係は次のとおりです。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/>
</parent>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
...
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
この問題を回避するには、Spring Bootのmaven-surefire-plugin
定義をオーバーライドし、useSystemClassLoader
をfalse
に設定します。詳しくは Surefire docs を読んでください。
<build>
<plugins>
...
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
Jedizが提供する<useSystemClassLoader>false</useSystemClassLoader>
ソリューションは私の確実なテストを実行することを可能にしましたが、私のSpring Boot統合テストのいくつかでクラスロードを壊しました。
次のmaven-surefire-plugin設定は私のために働きました:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
</configuration>
</plugin>
私には、解決策はmvnを次のように実行することでした。
_Java_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean compile package
他のアイデア(システムプロパティをmaven引数リストに与える、pom.xml
、settings.xml
のさまざまな変更)は機能しませんでした。
それが正確な解決策を含んでいなかったにもかかわらず、また この答え それがUbuntu JDKと2つの独立した、単独で無害なバグの不幸な協力であることを明らかにすることはとても役に立ちましたMaven Surefireプラグイン。
JDKとMavenのバージョンが同じ最近のDebian(バスター)はこの問題の影響を受けていないようですが、Ubuntu(xenial)は影響を受けています。
正確な解決策は this answerから来ています。
Maven-surefire-pluginを2.12.4から3.0.0-M1に更新してもうまくいきました。プロジェクトは明示的にプラグインを使用していなかったので、私は新しいプラグイン依存関係を追加しなければなりませんでした。
<plugins>
...
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
...
</plugins>
これを私のPOMの一番上(<project>
ノード内)に追加した後、私は自分のPOMからmaven-surefire-pluginを削除することができました。
<prerequisites>
<maven>3.6.1</maven>
</prerequisites>
なぜこれが正しい答えだと思いますか?
mvn versions:display-plugin-updates
を実行すると、super-pomからmaven-surefire-plugin 3.0.0-M3を使用していることがわかります。これまでのところ、この問題は修正されているようです。