[java] Eclipse + Spring Boot의 “throw new SilentExitException ()”에서 중단 점

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)



답변

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

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


답변

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.


답변

다음과 같은 구성에서 속성을 VM 인수로 추가합니다.

여기에 이미지 설명 입력

이렇게하면 다음을 사용할 때처럼 코드를 변경할 필요가 없습니다.

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


답변

내 해결 방법 :

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.

중단 점으로 문제를 해결하지 못합니다 …


답변

범위 런타임에서 devtools를 실행하십시오.

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


답변