Breakpoint tại “ném SilentExitException () mới” trong Eclipse + Spring Boot


83

Mỗi khi tôi chạy dự án Spring Boot của mình ở chế độ gỡ lỗi trong Eclipse IDE (Spring Tool Suite), luồng sẽ dừng ở throw new SilentExitException();dòng ngay cả khi không có điểm ngắt.

Có một số giải pháp để tránh hành vi này?

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

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

Điều này bắt đầu xảy ra sau khi nâng cấp lên Mốc 1.3.0.

Bộ công cụ mùa xuân

Version: 3.7.0.RELEASE
Build Id: 201506290649

Nền tảng:

Eclipse Luna SR2 (4.4.2)

2
Đối với người dùng IntelliJ đã hạ cánh tại đây: Thêm điều kiện cho điểm ngắt trong Run | Xem các điểm ngắt ... | Bất kỳ ngoại lệ nào: return !(this instanceof org.springframework.boot.devtools.restart.SilentExitExceptionHandler.SilentExitException);Đây phải là Java ngay cả khi bạn phát triển bằng ngôn ngữ JVM khác.
Marco Eckstein

Câu trả lời:


127

Rất tiếc, đây là một vấn đề đã biết với spring-boot-devtoolsmô-đun mới (xem https://github.com/spring-projects/spring-boot/issues/3100 ). Chúng tôi sử dụng thủ thuật này để giết luồng chính để có thể thay thế nó bằng một phiên bản có thể tải lại. Cho đến nay, tôi vẫn chưa tìm ra cách để ngăn chặn điểm ngắt gỡ lỗi kích hoạt.

Hiện tại, bạn có thể chuyển đổi hộp kiểm "tạm ngừng thực thi đối với các trường hợp ngoại lệ chưa được thông báo" trong Java -> Tùy chọn gỡ lỗi để ngăn điều đó xảy ra.


6
Vấn đề này vẫn còn hiện tại không may.
Stefan Falk

1
Vấn đề này vẫn còn hiện tại.
nabster

1
vẫn còn: p
Sachin Sharma

2
Vấn đề này vẫn còn. sử dụng Phiên bản Eclipse: 2019-06 (4.12.0) & spring-boot 2.0.6. Window-> Preferences -.> Java -> Debig -> bỏ chọn "Tạm dừng thực thi đối với các trường hợp ngoại lệ chưa được giải quyết"
src3369

Vẫn có mặt với phiên bản Eclipse 2020-03 (4.15.0) & spring-boot 2.3.1
HDJEMAI

11

Vì Eclipse trên chế độ Gỡ lỗi đã cho phép vá nóng hạn chế, tôi thấy trình tải lại thường xuyên phản tác dụng và vì vậy tôi quyết định vô hiệu hóa nó bằng cách:

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

Tham khảo: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart-disable

Vì ngoại lệ đó được trình tải lại ném ra, điều này cũng giải quyết được vấn đề này. Lưu ý rằng bạn sẽ phải sử dụng System.setPropertyphương pháp thay vì thiết lập nó application.properties.


8

Thêm thuộc tính làm đối số VM trong cấu hình như:

nhập mô tả hình ảnh ở đây

Bằng cách đó, bạn không phải thay đổi mã của mình, như trường hợp khi sử dụng:

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

Trong số các tùy chọn khác, tôi đã sử dụng cái này. Cảm ơn rất nhiều vì đã làm cho ngày của tôi!
sivakadi

2

Cách giải quyết của tôi:

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

Không quan trọng là chúng tôi bỏ qua SilentExitExceptionbởi vì các devtools chỉ đang khởi động lại cá thể với một cá SilentExitExceptionthể không phải là rất im lặng. Khối thử này sẽ tắt tiếng nó ...

Tôi đã phải sử dụng đối sánh văn bản trên lớp vì SilentExitExceptionlà riêng tư trong SilentExitExceptionHandler.

Nó không giải quyết được vấn đề của bạn với điểm ngắt ...


1

Cố gắng chạy devtools trong thời gian chạy phạm vi:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.