Eclipse + Spring Bootの「thrownewSilentExitException()」でのブレークポイント


83

Eclipse IDE(Spring Tool Suite)のデバッグモードでSpring Bootプロジェクトを実行するたびにthrow new SilentExitException();、ブレークポイントがなくてもスレッドは行で停止します。

この動作を回避するための解決策はありますか?

org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread() (line 53):

public static void exitCurrentThread() {
    throw new SilentExitException();
}

これは、1.3.0マイルストーンへのアップグレード後に発生し始めます。

Spring Tool Suite

Version: 3.7.0.RELEASE
Build Id: 201506290649

プラットホーム:

Eclipse Luna SR2 (4.4.2)

2
ここに到達したIntelliJユーザーの場合:実行|のブレークポイントに条件を追加します。ブレークポイントを表示... | 例外:return !(this instanceof org.springframework.boot.devtools.restart.SilentExitExceptionHandler.SilentExitException);別のJVM言語で開発する場合でも、これはJavaである必要があります。
MarcoEckstein19年

回答:


127

残念ながら、これは新しいspring-boot-devtoolsモジュールの既知の問題です(https://github.com/spring-projects/spring-boot/issues/3100を参照)。このトリックを使用してメインスレッドを強制終了し、再読み込み可能なバージョンに置き換えることができます。これまでのところ、デバッグブレークポイントがトリガーされないようにする方法は見つかりませんでした。

今のところ、Java->デバッグ設定の「キャッチされなかった例外で実行を一時停止する」チェックボックスを切り替えて、それが発生しないようにすることができます。


6
残念ながら、この問題はまだ存在しています。
Stefan Falk 2017年

1
この問題はまだ存在しています。
nabster

1
まだ存在します:p
SachinSharma20年

2
この問題はまだ存在します。Eclipseバージョンの使用:2019-06(4.12.0)&spring-boot2.0.6。ウィンドウ->設定-。> Java-> Debig->チェックを外した「キャッチされなかった例外で実行を一時停止する」
src33 6920年

Eclipseバージョン2020-03(4.15.0)およびspring-boot2.3.1で引き続き存在します
HDJEMAI

11

Eclipse on Debugモードではすでに制限付きのホットパッチが許可されているため、ほとんどの場合、リローダーは逆効果であることがわかり、次の方法で無効にすることにしました。

System.setProperty("spring.devtools.restart.enabled", "false");

参照:https//docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart-disable

その例外はリローダーによってスローされるため、これによってこの問題も解決されます。System.setPropertyで設定する代わりに、メソッドを使用する必要があることに注意してくださいapplication.properties


8

次のような構成で、VM引数としてプロパティを追加します。

ここに画像の説明を入力してください

そうすれば、以下を使用する場合のように、コードを変更する必要はありません。

System.setProperty("spring.devtools.restart.enabled", "false");

他の選択肢の中から、これを使いました。私の一日を作ってくれてありがとう!
sivakadi

2

私の回避策:

public static void main(String[] args) {
    try {
        SpringApplication.run(App.class, args);
    } catch (Throwable e) {
        if(e.getClass().getName().contains("SilentExitException")) {
            LOGGER.debug("Spring is restarting the main thread - See spring-boot-devtools");
        } else {
            LOGGER.error("Application crashed!", e);
        }
    }
}

無視してもかまいません SilentExitExceptiondevtoolsは、SilentExitExceptionあまりサイレントではないでインスタンスを再起動しているだけなので、。このtryブロックはそれを沈黙させます...

SilentExitExceptionはプライベートであるため、クラスでテキストマッチングを使用する必要がありましたSilentExitExceptionHandler

ブレークポイントの問題は解決しません...


1

スコープの実行時にdevtoolsを実行してみてください。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.