Haltepunkt bei "Neue SilentExitException () auslösen" in Eclipse + Spring Boot

80

Jedes Mal, wenn ich mein Spring Boot-Projekt im Debug-Modus in Eclipse IDE (Spring Tool Suite) ausführe, stoppt der Thread throw new SilentExitException();auch ohne Haltepunkt an der Zeile.

Gibt es eine Lösung, um dieses Verhalten zu vermeiden?

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

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

Dies geschieht nach dem Upgrade auf 1.3.0 Milestones.

Spring Tool Suite

Version: 3.7.0.RELEASE
Build Id: 201506290649

Plattform:

Eclipse Luna SR2 (4.4.2)
Bruno De Freitas Barros
quelle
2
Für IntelliJ-Benutzer, die hier gelandet sind: Fügen Sie dem Haltepunkt in Ausführen | eine Bedingung hinzu Haltepunkte anzeigen ... | Ausnahmen: return !(this instanceof org.springframework.boot.devtools.restart.SilentExitExceptionHandler.SilentExitException);Dies muss Java sein, auch wenn Sie in einer anderen JVM-Sprache entwickeln.
Marco Eckstein

Antworten:

125

Dies ist leider ein bekanntes Problem mit dem neuen spring-boot-devtoolsModul (siehe https://github.com/spring-projects/spring-boot/issues/3100 ). Wir verwenden diesen Trick, um den Haupt-Thread zu beenden, damit wir ihn durch eine wieder ladbare Version ersetzen können. Bisher habe ich keine Möglichkeit gefunden, das Auslösen des Debug-Haltepunkts zu verhindern.

Im Moment können Sie das Kontrollkästchen "Ausführung bei nicht erfassten Ausnahmen anhalten" in Java -> Debug-Einstellungen umschalten, um dies zu verhindern.

Phil Webb
quelle
6
Dieses Problem ist leider immer noch vorhanden.
Stefan Falk
1
Dieses Problem ist noch vorhanden.
Nabster
1
noch vorhanden: p
Sachin Sharma
2
Dieses Problem ist noch vorhanden. Verwenden von Eclipse Version: 2019-06 (4.12.0) & Spring-Boot 2.0.6. Fenster-> Einstellungen -.> Java -> Debig -> deaktiviert "Ausführung bei nicht
erfassten
Immer noch vorhanden mit Eclipse Version 2020-03 (4.15.0) & Spring-Boot 2.3.1
HDJEMAI
10

Da der Eclipse on Debug-Modus bereits begrenztes Hotpatching zulässt, ist der Reloader die meiste Zeit kontraproduktiv. Daher habe ich beschlossen, ihn zu deaktivieren, indem ich:

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

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

Da diese Ausnahme vom Reloader ausgelöst wird, wird auch dieses Problem behoben. Beachten Sie, dass Sie die System.setPropertyMethode verwenden müssen, anstatt sie festzulegen application.properties.

RichN
quelle
7

Fügen Sie die Eigenschaft als VM-Argument in die Konfiguration ein:

Geben Sie hier die Bildbeschreibung ein

Auf diese Weise müssen Sie Ihren Code nicht ändern, wie dies bei der Verwendung von:

System.setProperty("spring.devtools.restart.enabled", "false");
xbranko
quelle
Aus anderen Optionen habe ich dies verwendet. Vielen Dank für meinen Tag!
Sivakadi
2

Meine Problemumgehung:

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);
        }
    }
}

Es spielt keine Rolle, dass wir das ignorieren, SilentExitExceptionda die devtools die Instanz nur mit a neu startenSilentExitException nicht sehr leisen . Dieser Versuchsblock wird es zum Schweigen bringen ...

Ich musste Textabgleich für die Klasse verwenden, da diese SilentExitExceptionprivat ist SilentExitExceptionHandler.

Es löst Ihr Problem mit dem Haltepunkt nicht ...

Dan Thomas
quelle
1

Versuchen Sie, devtools zur Laufzeit des Bereichs auszuführen:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
ra1729
quelle