web-dev-qa-db-ja.com

Spring Bootがmaven-surefire-pluginの実行に失敗するClassNotFoundException org.Apache.maven.surefire.booter.ForkedBooter

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>
53
jediz

この問題を回避するには、Spring Bootのmaven-surefire-plugin定義をオーバーライドし、useSystemClassLoaderfalseに設定します。詳しくは Surefire docs を読んでください。

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

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>
17

私には、解決策はmvnを次のように実行することでした。

_Java_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean compile package

他のアイデア(システムプロパティをmaven引数リストに与える、pom.xmlsettings.xmlのさまざまな変更)は機能しませんでした。

それが正確な解決策を含んでいなかったにもかかわらず、また この答え それがUbuntu JDKと2つの独立した、単独で無害なバグの不幸な協力であることを明らかにすることはとても役に立ちましたMaven Surefireプラグイン。

JDKとMavenのバージョンが同じ最近のDebian(バスター)はこの問題の影響を受けていないようですが、Ubuntu(xenial)は影響を受けています。

正確な解決策は this answerから来ています。

10
peterh

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>
9
rvange

これを私のPOMの一番上(<project>ノード内)に追加した後、私は自分のPOMからmaven-surefire-pluginを削除することができました。

<prerequisites>
    <maven>3.6.1</maven>
</prerequisites>

なぜこれが正しい答えだと思いますか?

  • Mavenが使用を推奨するMavenのバージョンを示します。 https://maven.Apache.org/download.cgi
  • mvn versions:display-plugin-updatesを実行すると、super-pomからmaven-surefire-plugin 3.0.0-M3を使用していることがわかります。これまでのところ、この問題は修正されているようです。
  • 個々のプラグインのバージョンを個別に管理する必要はありません。スーパーポンバージョンを制御するあなたの最小のMavenバージョンだけ。
0
GlenPeterson