Eclipse + Spring Boot의 "throw new SilentExitException ()"에서 중단 점


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 마일스톤으로 업그레이드 한 후에 시작됩니다.

스프링 도구 모음

Version: 3.7.0.RELEASE
Build Id: 201506290649

플랫폼:

Eclipse Luna SR2 (4.4.2)

2
여기에 착륙 한 IntelliJ 사용자의 경우 : Run | 중단 점보기 ... | 모든 예외 : return !(this instanceof org.springframework.boot.devtools.restart.SilentExitExceptionHandler.SilentExitException);다른 JVM 언어로 개발하더라도 Java 여야합니다.
Marco Eckstein

답변:


127

이것은 안타깝게도 새 spring-boot-devtools모듈 의 알려진 문제입니다 ( https://github.com/spring-projects/spring-boot/issues/3100 참조 ). 이 트릭을 사용하여 메인 스레드를 종료하여 다시로드 할 수있는 버전으로 교체 할 수 있습니다. 지금까지 디버그 중단 점이 트리거되는 것을 방지하는 방법을 찾지 못했습니다.

지금은 Java-> 디버그 환경 설정에서 "발견되지 않은 예외에 대한 실행 일시 중지"확인란을 토글하여 발생하지 않도록 할 수 있습니다.


6
이 문제는 안타깝게도 여전히 존재합니다.
Stefan Falk 2017 년

1
이 문제는 여전히 존재합니다.
nabster

1
여전히 : P
Sachin 샤르마

2
이 문제는 여전히 존재합니다. Eclipse 버전 사용 : 2019-06 (4.12.0) 및 spring-boot 2.0.6. 창-> 환경 설정-.> Java-> Debig-> "
잡지

Eclipse 버전 2020-03 (4.15.0) 및 spring-boot 2.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.