Spring Boot 开发工具 2.6.6 Spring Boot 2.6.6 Maven Java 11
可能与#1106相关
当我尝试对在 Docker 容器内运行的应用程序进行更改时,我遇到一个问题,当我在 IDE 中触发构建时,正在运行的服务会抛出以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'verificationService':
Resolution of declared constructors on bean Class [com.service.v2.VerificationService] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@776edae1] failed; nested exception is java.lang.NoClassDefFoundError: com/service/v2/ChatService
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:309) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1302) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1219) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.18.jar!/:5.3.18]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.18.jar!/:5.3.18]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.18.jar!/:5.3.18]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.6.jar!/:2.6.6]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740) ~[spring-boot-2.6.6.jar!/:2.6.6]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:415) ~[spring-boot-2.6.6.jar!/:2.6.6]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) ~[spring-boot-2.6.6.jar!/:2.6.6]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-2.6.6.jar!/:2.6.6]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.6.jar!/:2.6.6]
at com.ChatApplication.main(ChatApplication.java:24) ~[classes!/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.6.6.jar!/:2.6.6]
Caused by: java.lang.NoClassDefFoundError: com/service/v2/ChatService
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) ~[na:na]
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137) ~[na:na]
at java.base/java.lang.Class.getDeclaredConstructors(Class.java:2357) ~[na:na]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:304) ~[spring-beans-5.3.18.jar!/:5.3.18]
Caused by: java.lang.ClassNotFoundException: com.service.v2.ChatService
at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:136) ~[spring-boot-devtools-2.6.6.jar!/:2.6.6]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
这似乎是一个类加载问题,我们使用 lombok 注释进行类依赖注入,这可能是导致此问题的原因。我尝试在 VerificationService 类中用构造函数替换它,但仍然会引发相同的问题。按照spring boot dev tools 文档 -禁用重启的类加载问题中的说明进行操作,这可以停止错误,但 LiveReload 之后所做的更改未应用。
在 IDE 中进行任何更改之前,我运行了spring boot dev tools docs - 远程应用程序的说明。
该容器目前未分配到任何网络,且暴露了 8120 端口
目前,我解决这个问题的方法是不使用开发工具(完全删除它),而是使用 IntelliJ 的本机远程 JVM 调试并连接到端口 5005。我已经能够通过这种方式做出反映在正在运行的服务中的更改(尽管仅限于没有架构或方法签名更改)但如果这可以与开发工具一起使用会更好。
现在谢谢了。