【问题标题】:Spring boot devtools and ActiveJDBC integrationSpring boot devtools 和 ActiveJDBC 集成
【发布时间】:2020-03-30 10:21:03
【问题描述】:

有没有办法将Spring boot devtools的自动重启功能与ActiveJDBCinstrumentation功能结合起来?

每次模型或DB发生变化时也需要提供instrumentation,但是Spring boot的devtools端有Auto-Restart时生成的代码是由ActiveJDBC端的instrumentation生成的与代码发生异步,即使是源码上的同一个类,也不会匹配,会报错,不能强制转换。

例如。

class dev.logue.sample.models.User cannot be cast to class dev.logue.sample.models.User (dev.logue.sample.models.User is in unnamed module of loader 'app'; dev.logue.sample.models.User is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader

我对Java不是很熟悉,有什么方法可以同步这个过程吗?

我的环境:

openjdk version "11.0.6" 2020-01-14 LTS
OpenJDK Runtime Environment Zulu11.37+17-CA (build 11.0.6+10-LTS)
OpenJDK 64-Bit Server VM Zulu11.37+17-CA (build 11.0.6+10-LTS, mixed mode)

【问题讨论】:

  • 为什么不在构建过程中检测?你还需要编译,对吗?
  • 我认为发生了错误,即使与上述错误消息中的类相同,也无法转换该类。
  • 您是否在检测后重新启动该过程?
  • 是的。但是,当我修改其他代码时,Spring devtools 重新加载,最终导致上述错误。如果不能投同一个类,我想可能是Spring生成的二进制和ActiveJDBC的Instrument生成的二进制不匹配造成的。
  • 不,真正的原因是因为类的不同实例被不同的类加载器加载。用不同的类加载器加载的同一个类被 JVM 视为不同的类。我不熟悉 SpringBoot,但我认为这是问题的原因。刚重新启动进程时是否有同样的问题?

标签: java spring-boot instrumentation activejdbc spring-boot-devtools


【解决方案1】:

自己解决了。

显然,spring-devtools.properties 应该显式加载 ActiveJDBC 生成的类。

src/main/resources/META-INF/spring-devtools.properties:

restart.include.activejdbc=/activejdbc-[\\w\\d-\.]+\.jar

报错信息没有包含activejdbc,所以我以为和instrumentation后生成的class文件有关。

另外,为了以防万一,application.properties 中的 Spring devtools 扫描路径中省略了模型类。

src/main/resources/application.properties:

spring.devtools.restart.additional-exclude=src/main/java/dev/logue/sample/models/**

【讨论】:

  • 听起来很合理,这是否解决了您最初的问题?
  • 是的。然后,如果可能的话,我希望能够在模型目录更新时自动检测。
  • 你可以为此写一个脚本:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2015-05-29
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2016-09-20
相关资源
最近更新 更多