使用spring boot devtools不要多此一举加try...catch

简介:

spring-boot-devtools是个好东西,在开发调试时可以随时热部署,不用每次手工启停。前两天一个项目查log,发现总有这样的错误日志输出:


org.springframework.boot.devtools.restart.SilentExitExceptionHandler$SilentExitException

  at org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread(SilentExitExceptionHandler.java:90)

  at org.springframework.boot.devtools.restart.Restarter.immediateRestart(Restarter.java:184)

  at org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:163)

  at org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:552)

  at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationStartingEvent(RestartApplicationListener.java:67)

  at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationEvent(RestartApplicationListener.java:45)

  at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)

  at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)

  at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)

  at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:68)

  at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:48)

  at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)

  at org.test.Application.main(Application.java:15)


看一下项目的主体结构,大致是这样的,我做了简化:


首先是spring boot的启动入口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package  org.test;
 
import  org.springframework.boot.SpringApplication;
import  org.springframework.boot.Banner.Mode;
import  org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public  class  Application {
     public  static  void  main(String[] args) {
         try  {
             SpringApplication app =  new  SpringApplication(Application. class );
             app.setBannerMode(Mode.OFF);
             app.setWebEnvironment( false );
             app.run(args);
         }
         catch (Exception ex) {
             ex.printStackTrace();
         }
     }
}


主服务大致是这样的(已简化):

1
2
3
4
5
6
7
8
9
10
11
12
package  org.test;
 
import  javax.annotation.PostConstruct;
import  org.springframework.stereotype.Service;
 
@Service
public  class  MainService {
     @PostConstruct
     public  void  startServer() {
         System.out.println( "START" );
     }
}


只要一启动,就会报上面的错误,但实际上又不影响任何功能,devtools的热部署功能也仍然生效。对比以前的项目查了查,发现问题出在main()方法上,SpringApplication.run()一但放到try...catch块里就会导致devtools抛个异常。把main()里的try...catch去掉,或者把app.run(args)这句移出try...catch,或者catch到异常不要printStackTrace(),再运行就不会有错误日志了。


具体原因等有空了再去翻源码吧,对spring boot来说,启动时try...catch真的是多此一举。





     本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/1919063,如需转载请自行联系原作者


相关文章
|
25天前
|
设计模式 存储 Java
【Spring Boot 源码学习】初识 SpringApplication
【4月更文挑战第10天】本篇带大家初步了解 Spring Boot 的启动类 SpringApplication
36 1
【Spring Boot 源码学习】初识 SpringApplication
|
2月前
|
Java 编译器 API
Spring Boot 异常处理
Java异常分为 Throwable 类的两个子类:Error 和 Exception。Error 是不可捕获的,由JVM处理并可能导致程序终止,如 OutOfMemoryError。Exception 是可捕获的,包括运行时异常如 ArrayIndexOutOfBoundsException 和编译时异常如 IOException。
15 1
|
7月前
|
Java 测试技术 Spring
Spring Boot + @Async =?
Spring Boot + @Async =?
33 0
|
Java Spring
Spring boot Gudies JPA运行报错
Spring boot Gudies 中的JPA实例运行报错
Spring boot Gudies JPA运行报错
|
Java Spring
【Spring Boot实战与进阶】Spring Boot Devtools实现热部署
在我们平时的日常开发工作中,修改了Java代码或者配置文件的时候,必须手动重启项目才能生效。所谓的热部署就是在你修改了后端代码后不需要手动重启,工具会帮你快速的自动重启使其生效。其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
【Spring Boot实战与进阶】Spring Boot Devtools实现热部署
|
缓存 IDE 前端开发
使用Spring Boot DevTools加快开发速度(一)。
DevTools 支持自动刷新与自动重启 –自动刷新(或自动加载)是指在浏览器中重新加载UI,以查看静态内容的更改。自动重新启动是指重新加载服务器端代码和配置,然后重新启动服务器。
277 0
使用Spring Boot DevTools加快开发速度(一)。
|
IDE 安全 Java
使用Spring Boot DevTools加快开发速度(二)
DevTools 支持自动刷新与自动重启 –自动刷新(或自动加载)是指在浏览器中重新加载UI,以查看静态内容的更改。自动重新启动是指重新加载服务器端代码和配置,然后重新启动服务器。
201 0
使用Spring Boot DevTools加快开发速度(二)
|
Java API Spring
Spring Boot 整合 Spring Data JPA
Java 持久化 API (JPA)是一个 Java 应用程序接口 规范,描述了使用 Java标准版平台(Java SE) 和 Java企业版平台(Java EE)的应用中的 关系数据 的管理
147 0
|
Web App开发 缓存 前端开发
Spring Boot devtool的使用
Spring Boot devtool的使用
Spring Boot devtool的使用
|
Java Spring
Spring Boot Runner启动器
Runner启动器 如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。
134 0