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)

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.


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.


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

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


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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.