使用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的启动入口:

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

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

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真的是多此一举。

时间: 2024-10-18 12:55:32

使用spring boot devtools不要多此一举加try...catch的相关文章

使用IDEA 中 实现springboot 热部署 (spring boot devtools版)

第一步:添加springboot的配置文件 首先我先贴出我的配置 添加依赖包 <!-- spring boot devtools 依赖包. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <

IDEA新建SpringBoot+MySQL+MyBatis+Lombok+Spring Boot DevTools项目

一,IDEA新建SpringBoot+MySQL+MyBatis+Lombok+Spring Boot DevTools项目 1,新建项目的选中项 2,新建后我们需要配置勾选这个自动编译 3,按住shift+alt+ctrl+/,然后选中registry 4,然后选中这个选项 5,然后在 pom.xml文件添加以下代码,开启热部署工具,不配置不生效 <build> <plugins> <plugin> <groupId>org.springframework

Spring Boot 2程序不能加载 com.mysql.jdbc.Driver 问题

用Spring Boot Starter 向导生成了一个很简单SpringBoot程序, 用到了 MySQL, 总是下面不能加载 Mysql driver class 错误. Cannot load driver class: com.mysql.jdbc.Driver 刚开始以为是 application.properties 中相关的配置项写法不合规, 发现很正常. 检查了 MySQL jar 文件也很正常. 突然想起之前好像也碰到过同样的问题, 又想了很久, 终于想起上次是因为用了 spr

spring boot开发 静态资源加载不出来

spring boot 1.5 版本之前 不拦截静态资源 springboot 2.x版本 拦截静态资源 private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/&quo

Spring Boot 2 启动时加载properties文件

每个项目从开发到测试再到上线所需要的各种环境是不同的,这就需要维护相应的配置文件,比如properties或yml文件.有了配置文件后就要考虑如何与应用进行集成. 对于云环境来讲,项目发布需要打成镜像,再进行部署.如果把spring boot项目连同配置文件(变量)一起打入JAR包并不是一个很好的选择,我们的做法是JAR不包含配置文件,待启动镜像和JAR时将配置文件动态赋值给JAR包. 对于Spring Boot项目,有两种做法可以实现该目的: 1. --spring.config.locati

spring boot 访问项目时加项目名称

pringboot 项目一般直接地址加端口就可以访问了,不像放在tomcat里面还需要加上项目名. 现在,想访问的时候加上项目名用来区分,只要在配置文件里面加上 server.context-path=/项目名,就可以了 server.context-path=/easyUI_boot 原文链接 : https://blog.csdn.net/orangetop/article/details/80598108 原文地址:https://www.cnblogs.com/helloworld637

spring boot 项目 freemarker 无法加载static 中 js css 文件 原因(报错404)

去掉@EnableWebMvc  注解 ,相关原因请看原博文 https://blog.csdn.net/testcs_dn/article/details/80249894 原文地址:https://www.cnblogs.com/0kuxia0/p/9605436.html

Spring Boot 配置加载顺序详解

使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 Spring Boot 里面,可以使用以下几种方式来加载配置.本章内容基于 Spring Boot 2.0 进行详解. 1.properties文件: 2.YAML文件: 3.系统环境变量: 4.命令行参数: 等等-- 我们可以在 Spring Beans 里面直接使用这些配置文件中加载的值,如:

Spring Boot(3):加载DataSource过程的源码分析及yml中DataSource的配置

Spring Boot实现了自动加载DataSource及相关配置.当然,使用时加上@EnableAutoConfiguration注解是必须的.下面就是对这一部分的源码分析. (1)Spring Boot启动后会调用org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.下面是部分源码. 1 @Configuration 2 @ConditionalOnClass({ DataSource.class, E