熊猫的地盘

熊猫的地盘

熊猫的地盘

世界上没有安逸又精彩的人生,美好的前程,都是血汗打下来的!

20 文章数
25 评论数

SpringBoot配置devtools的坑

Pedon
2022-08-25 / 0 评论 / 429 阅读 / 1 点赞

最近搭建项目的时候想要配置一个热部署,所以依赖了devtools,也就顺便进了devtools的坑。
问题发现的起因是因为想要在启动类加一些启动验证,这时候发现验证会执行两次。

2022-08-25 18:21:08: INFO [main] c.e.c.c.l .java:29 - oswindows 7
2022-08-25 18:21:08: INFO [main] c.e.c.c.l .java:32 - This is windows
2022-08-25 18:21:09: INFO [restartedMain] c.e.c.c.l.v.VerifyBeforeStartUp 
2022-08-25 18:21:09: INFO [restartedMain] c.e.c.c.l.u.SystemTool SystemTool.java:29 - oswindows 7

发现验证方法会被执行两次。一次是线程mian,另外一次是线程restartedMain。
通过查询资料发现是因为热部署插件devtools引起的。猜测可能的原因是类加载器不同导致的。

解决方案:

  1. 去掉devtools,问题不攻自破
  2. 用系统类加载器+反射来获取instance,如下:
try {
	ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
	Class<?> aClass = systemClassLoader.loadClass("com.a.b.c.ConnectionPool");
	Method getInstance = MethodUtils.getMatchingMethod(aClass, "getInstance");
	ConnectionPool invoke = (ConnectionPool)getInstance.invoke(null);
	System.out.println(aClass);
	System.out.println(aClass.getClassLoader());
}catch (Exception e) {
	e.printStackTrace();
}
上一篇 下一篇
评论
来首音乐
最新回复
光阴似箭
今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月