एक्लिप्स + स्प्रिंग बूट में "थ्रो न्यू साइलेंट एक्सिट एक्ससेप्शन ()"


83

हर बार जब मैं ग्रहण आईडीई (स्प्रिंग टूल सूट) में अपने स्प्रिंग बूट प्रोजेक्ट को डिबग मोड पर चलाता हूं, तो थ्रेड throw new SilentExitException();बिना ब्रेकप्वाइंट के भी लाइन में रुक जाता है ।

क्या इस व्यवहार से बचने का कोई उपाय है?

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

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

यह 1.3.0 मील के पत्थर के उन्नयन के बाद शुरू होता है।

स्प्रिंग टूल सूट

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 भाषा में विकसित हों।
मार्को एकस्टीन

जवाबों:


127

यह दुर्भाग्य से नए spring-boot-devtoolsमॉड्यूल के साथ एक ज्ञात मुद्दा है (देखें https://github.com/spring-projects/spring-boot/issues/3100 )। हम इस ट्रिक का उपयोग मुख्य धागे को मारने के लिए करते हैं ताकि हम इसे फिर से लोड करने योग्य संस्करण से बदल सकें। अब तक मुझे डिबग ब्रेकपॉइंट को ट्रिगर करने से रोकने का कोई तरीका नहीं मिला है।

अभी के लिए, आप जावा में - "डिबग किए गए अपवादों पर सस्पेंड निष्पादन" चेकबॉक्स को टॉगल कर सकते हैं -> इसे रोकने के लिए प्राथमिकताएँ डिबग करें।


6
यह मुद्दा अभी भी दुर्भाग्य से मौजूद है।
स्टीफन फॉक

1
यह मुद्दा अभी भी मौजूद है।
नाबस्टर 2'19

1
अभी भी मौजूद है: पी
सचिन शर्मा

2
यह मुद्दा अभी भी मौजूद है। ग्रहण संस्करण का उपयोग: 2019-06 (4.12.0) और वसंत-बूट 2.0.6। विंडो-> वरीयताएँ -> जावा -> डिबग -> अनियंत्रित "बिना किसी अपवाद के सस्पेंड निष्पादन"
src3369

अभी भी ग्रहण संस्करण २०२०-०३ (४.१५.०) और स्प्रिंग-बूट २.३.१ के साथ मौजूद है
HDJEMAI

11

जैसा कि डिबग मोड पर ग्रहण पहले से ही सीमित हॉटपैकिंग की अनुमति देता है, मुझे लगता है कि अधिकांश समय पुनः लोड करने वाला प्रतिसंबंधी है और इसलिए मैंने इसे निष्क्रिय करने का निर्णय लिया:

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

अन्य विकल्पों में से, मैंने इसका उपयोग किया। मेरा दिन बनाने के लिए बहुत बहुत धन्यवाद!
शिवकड़ी

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

इससे कोई फर्क नहीं पड़ता कि हम उपेक्षा करते हैं SilentExitExceptionक्योंकि भक्त केवल उदाहरण को पुनः आरंभ कर रहे हैं SilentExitExceptionजिसके साथ बहुत मौन नहीं है। यह कोशिश ब्लॉक इसे चुप करा देगी ...

मुझे कक्षा में पाठ मिलान का उपयोग करना SilentExitExceptionहै क्योंकि यह निजी है SilentExitExceptionHandler

यह ब्रेकपॉइंट के साथ आपकी समस्या का समाधान नहीं करता है ...


1

गुंजाइश रनटाइम पर devtools चलाने की कोशिश करें:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.