Eclipse 中 "throw new SilentExitException()" 处的断点 + Spring 引导
Breakpoint at "throw new SilentExitException()" in Eclipse + Spring Boot
每次我 运行 我的 Spring 在 Eclipse IDE(Spring 工具套件)中以调试模式启动项目时,线程停止在 throw new SilentExitException();
即使没有断点的行。
是否有一些解决方案可以避免这种行为?
org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread() (line 53):
public static void exitCurrentThread() {
throw new SilentExitException();
}
这在升级到 1.3.0 里程碑后开始发生。
Spring 工具套件
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 -> 调试首选项中切换 "suspend execution on uncaught exceptions" 复选框以防止它发生。
由于调试模式下的 Eclipse 已经允许有限的热修补,我发现重新加载器在大多数情况下会适得其反,所以我决定通过以下方式禁用它:
System.setProperty("spring.devtools.restart.enabled", "false");
由于重新加载器抛出异常,这也解决了这个问题。请注意,您必须使用 System.setProperty
方法而不是在 application.properties
.
中设置它
尝试 运行 devtools 范围 运行time:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
添加 属性 作为 VM 参数:
-Dspring.devtools.restart.enabled=false
这样您就不必更改代码,因为使用时就是这样:
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);
}
}
}
我们忽略 SilentExitException
并不重要,因为开发工具只是用 SilentExitException
重启实例,这不是很安静。此 try 块将使其静音...
我不得不在 class 上使用文本匹配,因为 SilentExitException
在 SilentExitExceptionHandler
中是私有的。
它没有解决你的断点问题...
我在 运行 宁 spring 启动项目时遇到了同样的问题。我发现 Main 方法中使用了 TRY CATCH 块。
删除 try catch 块 运行 代码。那个错误不会再来了。如下所示:
public static void main(String[] args) {
SpringApplication.run(TrewAuthApplication.class, args);
}
将这些删除到未知异常,它不会在那里中断:
不幸的是,我还没有找到使它永久生效的方法,但它应该会持续到您下次重新启动 eclipse 时。
在您的 application.properties 文件中将其设置为 true。
spring.devtools.restart.enabled=false
还要确保如果您使用 spring 云配置服务器,则没有启用此功能的属性文件。
我在 Kotlin 中的解决方法:
@JvmStatic
fun main(args: Array<String>) {
val app = SpringApplication(Application::class.java)
try {
app.run(*args)
} catch (e: Exception) {
preventNonNullExitCodeOnSilentExitException(e)
}
}
private fun preventNonNullExitCodeOnSilentExitException(e: Exception) {
if (e.toString().contains("SilentExitException")) {
log.info("Ignoring Silent Exit Exception...")
e.printStackTrace()
return
}
throw e
}
每次我 运行 我的 Spring 在 Eclipse IDE(Spring 工具套件)中以调试模式启动项目时,线程停止在 throw new SilentExitException();
即使没有断点的行。
是否有一些解决方案可以避免这种行为?
org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread() (line 53):
public static void exitCurrentThread() {
throw new SilentExitException();
}
这在升级到 1.3.0 里程碑后开始发生。
Spring 工具套件
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 -> 调试首选项中切换 "suspend execution on uncaught exceptions" 复选框以防止它发生。
由于调试模式下的 Eclipse 已经允许有限的热修补,我发现重新加载器在大多数情况下会适得其反,所以我决定通过以下方式禁用它:
System.setProperty("spring.devtools.restart.enabled", "false");
由于重新加载器抛出异常,这也解决了这个问题。请注意,您必须使用 System.setProperty
方法而不是在 application.properties
.
尝试 运行 devtools 范围 运行time:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
添加 属性 作为 VM 参数:
-Dspring.devtools.restart.enabled=false
这样您就不必更改代码,因为使用时就是这样:
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);
}
}
}
我们忽略 SilentExitException
并不重要,因为开发工具只是用 SilentExitException
重启实例,这不是很安静。此 try 块将使其静音...
我不得不在 class 上使用文本匹配,因为 SilentExitException
在 SilentExitExceptionHandler
中是私有的。
它没有解决你的断点问题...
我在 运行 宁 spring 启动项目时遇到了同样的问题。我发现 Main 方法中使用了 TRY CATCH 块。
删除 try catch 块 运行 代码。那个错误不会再来了。如下所示:
public static void main(String[] args) {
SpringApplication.run(TrewAuthApplication.class, args);
}
将这些删除到未知异常,它不会在那里中断:
不幸的是,我还没有找到使它永久生效的方法,但它应该会持续到您下次重新启动 eclipse 时。
在您的 application.properties 文件中将其设置为 true。
spring.devtools.restart.enabled=false
还要确保如果您使用 spring 云配置服务器,则没有启用此功能的属性文件。
我在 Kotlin 中的解决方法:
@JvmStatic
fun main(args: Array<String>) {
val app = SpringApplication(Application::class.java)
try {
app.run(*args)
} catch (e: Exception) {
preventNonNullExitCodeOnSilentExitException(e)
}
}
private fun preventNonNullExitCodeOnSilentExitException(e: Exception) {
if (e.toString().contains("SilentExitException")) {
log.info("Ignoring Silent Exit Exception...")
e.printStackTrace()
return
}
throw e
}