[spring-projects/spring-boot]由于静默期太短而导致的开发工具重启失败很难诊断

2024-06-26 689 views
3

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。我已经能够通过这种方式做出反映在正在运行的服务中的更改(尽管仅限于没有架构或方法签名更改)但如果这可以与开发工具一起使用会更好。

现在谢谢了。

回答

0

我们没有发现此方面存在任何问题。您能否提供一个最小示例和重现此问题的步骤?

6

聊天应用程序.zip

是的,刚刚使用相同的依赖项创建了一个示例 Web 服务,现在只有一个端点:GET http://localhost:8120/v2/chat/

它包含一个 Dockerfile,可以从中构建图像,因此您需要在后台运行 docker。

重现步骤:

  1. 在项目根目录中,构建 maven 项目:./mvnw clean install
  2. 在项目根目录中,使用以下命令构建 docker 镜像:docker buildx build -t chat-application .
  3. 使用构建的图像启动一个新容器:docker container run -p 8120:8120 --rm --name chat-application chat-application:latest
  4. 在 IDE 中(在本例中使用 IntelliJ):使用以下配置创建一个新的应用程序会话:
    • 主类:org.springframework.boot.devtools.RemoteSpringApplication
    • 程序参数:http://localhost:8120
    • 工作目录:不需要更改,已经指向项目
  5. 运行新的应用程序会话(应在 LiveReload 服务器运行时正常启动)
  6. 调用 GET http://localhost:8120/v2/chat/端点以确保服务正常运行
  7. 在 IDE 中:更改 VerificationService 中的 VERIFY_MSG 常量的值
  8. 在 IDE 中:构建项目

此时,正在运行的服务的 docker 容器日志应该抛出以下异常,我已设法在这个简化的示例中复制了该异常:

2022-07-06 16:08:32.387  WARN 1 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'otherService': Resolution of declared constructors on bean Class [com.chatapplication.service.v2.OtherService] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@7adf428a] failed; nested exception is java.lang.NoClassDefFoundError: com/chatapplication/service/v2/VerificationService
2022-07-06 16:08:32.388  INFO 1 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2022-07-06 16:08:32.397  INFO 1 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-07-06 16:08:32.422 ERROR 1 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'otherService': Resolution of declared constructors on bean Class [com.chatapplication.service.v2.OtherService] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@7adf428a] failed; nested exception is java.lang.NoClassDefFoundError: com/chatapplication/service/v2/VerificationService
    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.ChatApplication.main(ChatApplication.java:10) ~[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/chatapplication/service/v2/VerificationService
    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]
    ... 23 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.chatapplication.service.v2.VerificationService
    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]
    ... 27 common frames omitted

希望这会有所帮助?

1

感谢@iranicus 提供的示例。我尝试重现该问题,但至今未能成功。我使用 Eclipse 对应用程序代码进行了更改。结果显示以下日志:

2022-07-21 16:57:19.063  INFO 68207 --- [   File Watcher] o.s.b.d.r.c.ClassPathChangeUploader      : Uploaded 1 class resource
2022-07-21 16:57:20.072  INFO 68207 --- [pool-1-thread-1] o.s.b.d.r.c.DelayedLiveReloadTrigger     : Remote server has changed, triggering LiveReload

在远程端,这触发了预期的重启,并且成功了:

2022-07-21 15:54:20.423  INFO 1 --- [           main] com.chatapplication.ChatApplication      : Started ChatApplication in 2.12 seconds (JVM running for 2.574)
2022-07-21 15:57:08.267  INFO 1 --- [nio-8120-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-07-21 15:57:08.267  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-07-21 15:57:08.272  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 4 ms

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.6)

2022-07-21 15:57:19.187  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : Starting ChatApplication v0.0.1-SNAPSHOT using Java 11.0.16 on c6dfab6ed849 with PID 1 (/application/chat-app/chat-application.jar started by java_user in /application/chat-app)
2022-07-21 15:57:19.187  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : No active profile set, falling back to 1 default profile: "default"
2022-07-21 15:57:19.460  INFO 1 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8120 (http)
2022-07-21 15:57:19.461  INFO 1 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-07-21 15:57:19.461  INFO 1 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.60]
2022-07-21 15:57:19.463  INFO 1 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-07-21 15:57:19.464  INFO 1 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 274 ms
2022-07-21 15:57:19.492  WARN 1 --- [  restartedMain] .s.b.d.a.RemoteDevToolsAutoConfiguration : Listening for remote restart updates on /.~~spring-boot!~/restart
2022-07-21 15:57:19.576  INFO 1 --- [  restartedMain] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
2022-07-21 15:57:19.586  INFO 1 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8120 (http) with context path ''
2022-07-21 15:57:19.591  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : Started ChatApplication in 0.438 seconds (JVM running for 181.872)
2022-07-21 15:57:20.075  INFO 1 --- [nio-8120-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-07-21 15:57:20.075  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-07-21 15:57:20.076  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

我已经从应用程序中删除了 Lombok,因为我没有在 Eclipse 中安装该 Lombok 插件。不过我认为这不会有什么不同。接下来我将尝试使用 IntelliJ。

5

使用 IntelliJ 重新启动也成功并且 Lombok 恢复:

2022-07-21 15:57:19.591  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : Started ChatApplication in 0.438 seconds (JVM running for 181.872)
2022-07-21 15:57:20.075  INFO 1 --- [nio-8120-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-07-21 15:57:20.075  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-07-21 15:57:20.076  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.6)

2022-07-21 16:08:42.203  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : Starting ChatApplication v0.0.1-SNAPSHOT using Java 11.0.16 on c6dfab6ed849 with PID 1 (/application/chat-app/chat-application.jar started by java_user in /application/chat-app)
2022-07-21 16:08:42.204  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : No active profile set, falling back to 1 default profile: "default"
2022-07-21 16:08:42.427  INFO 1 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8120 (http)
2022-07-21 16:08:42.427  INFO 1 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-07-21 16:08:42.428  INFO 1 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.60]
2022-07-21 16:08:42.430  INFO 1 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-07-21 16:08:42.430  INFO 1 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 223 ms
2022-07-21 16:08:42.454  WARN 1 --- [  restartedMain] .s.b.d.a.RemoteDevToolsAutoConfiguration : Listening for remote restart updates on /.~~spring-boot!~/restart
2022-07-21 16:08:42.524  INFO 1 --- [  restartedMain] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
2022-07-21 16:08:42.533  INFO 1 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8120 (http) with context path ''
2022-07-21 16:08:42.538  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : Started ChatApplication in 0.361 seconds (JVM running for 865.295)
2022-07-21 16:08:43.101  INFO 1 --- [nio-8120-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-07-21 16:08:43.102  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-07-21 16:08:43.103  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

我也尝试过对OtherService和进行更改ChatController,并且也成功了。

我注意到上面报告的原始错误是java.lang.ClassNotFoundException: com.service.v2.ChatService。样本中没有这样的类。我怀疑这是由于在生成最小样本时所做的更改造成的,但我只是想再检查一下样本是否确实为您重现了失败。

7

今天下午我将再次快速查看,看看是否可以使用示例聊天应用程序再次复制该问题,然后再回复您。

3

是的,在创建用于演示目的的附加聊天应用程序之前,为了匿名,类的名称已被更改。我重复了之前提到的步骤,当我更改 VerificationService 中 VERIFY_MSG 字段的值并在运行时重建服务时,我遇到了同样的问题:

2022-07-23 12:50:18.541  INFO 45806 --- [           main] o.s.b.devtools.RemoteSpringApplication   : No active profile set, falling back to 1 default profile: "default"
2022-07-23 12:50:18.769  WARN 45806 --- [           main] o.s.b.d.r.c.RemoteClientConfiguration    : The connection to http://localhost:8120 is insecure. You should use a URL starting with 'https://'.
2022-07-23 12:50:18.823  INFO 45806 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2022-07-23 12:50:18.838  INFO 45806 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 0.737 seconds (JVM running for 1.266)
2022-07-23 12:52:24.084  INFO 45806 --- [   File Watcher] o.s.b.d.r.c.ClassPathChangeUploader      : Uploaded 1 class resource
2022-07-23 12:52:25.510  WARN 45806 --- [   File Watcher] o.s.b.d.r.c.ClassPathChangeUploader      : A failure occurred when uploading to http://localhost:8120/.~~spring-boot!~/restart. Upload will be retried in 2 seconds

日志末尾提到的失败是由于服务停止导致的,docker 容器日志显示以下内容:

2022-07-23 11:49:36.594  INFO 1 --- [           main] com.chatapplication.ChatApplication      : Starting ChatApplication v0.0.1-SNAPSHOT using Java 11.0.15 on ce40804ee34d with PID 1 (/application/chat-app/chat-application.jar started by java_user in /application/chat-app)
2022-07-23 11:49:36.597  INFO 1 --- [           main] com.chatapplication.ChatApplication      : No active profile set, falling back to 1 default profile: "default"
2022-07-23 11:49:36.665  INFO 1 --- [           main] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2022-07-23 11:49:36.666  INFO 1 --- [           main] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2022-07-23 11:49:37.823  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8120 (http)
2022-07-23 11:49:37.836  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-07-23 11:49:37.837  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.60]
2022-07-23 11:49:37.901  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-07-23 11:49:37.901  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1234 ms
2022-07-23 11:49:38.089  WARN 1 --- [           main] .s.b.d.a.RemoteDevToolsAutoConfiguration : Listening for remote restart updates on /.~~spring-boot!~/restart
2022-07-23 11:49:38.493  INFO 1 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
2022-07-23 11:49:38.551  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8120 (http) with context path ''
2022-07-23 11:49:38.570  INFO 1 --- [           main] com.chatapplication.ChatApplication      : Started ChatApplication in 2.519 seconds (JVM running for 2.965)
2022-07-23 11:51:17.156  INFO 1 --- [nio-8120-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-07-23 11:51:17.157  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-07-23 11:51:17.158  INFO 1 --- [nio-8120-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.6)

2022-07-23 11:52:24.242  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : Starting ChatApplication v0.0.1-SNAPSHOT using Java 11.0.15 on ce40804ee34d with PID 1 (/application/chat-app/chat-application.jar started by java_user in /application/chat-app)
2022-07-23 11:52:24.243  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : No active profile set, falling back to 1 default profile: "default"
2022-07-23 11:52:24.665  INFO 1 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8120 (http)
2022-07-23 11:52:24.667  INFO 1 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-07-23 11:52:24.667  INFO 1 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.60]
2022-07-23 11:52:24.671  INFO 1 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-07-23 11:52:24.671  INFO 1 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 423 ms
2022-07-23 11:52:24.711  WARN 1 --- [  restartedMain] .s.b.d.a.RemoteDevToolsAutoConfiguration : Listening for remote restart updates on /.~~spring-boot!~/restart
2022-07-23 11:52:24.718  WARN 1 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'otherService': Resolution of declared constructors on bean Class [com.chatapplication.service.v2.OtherService] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@105f7e57] failed; nested exception is java.lang.NoClassDefFoundError: com/chatapplication/service/v2/VerificationService
2022-07-23 11:52:24.719  INFO 1 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2022-07-23 11:52:24.730  INFO 1 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-07-23 11:52:24.757 ERROR 1 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'otherService': Resolution of declared constructors on bean Class [com.chatapplication.service.v2.OtherService] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@105f7e57] failed; nested exception is java.lang.NoClassDefFoundError: com/chatapplication/service/v2/VerificationService
    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.ChatApplication.main(ChatApplication.java:10) ~[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/chatapplication/service/v2/VerificationService
    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]
    ... 23 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.chatapplication.service.v2.VerificationService
    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]
    ... 27 common frames omitted

该服务在 11:51 时启动正常,然后当 IntelliJ 在端口 8120 上运行远程调试时,我触发了 IDE 中的手动构建,并进行了上述更改。这确实导致服务重新启动,您可以从 11:52 看到这一点,这导致几秒钟后在为 OtherService 加载更新的 VerificationService 依赖项时显示最终异常。

您能否尝试对 VerificationService 进行相同的更改,然后重建?

0

您能否尝试对 VerificationService 进行相同的更改,然后重建?

不幸的是,这正是我已经尝试过的方法。我更改了常量的值VERIFY_MSG,应用程序重新启动,并发出请求以http://localhost:8120/v2/chat/显示正在使用的新值。

上面的日志显示正在使用 Java 11.0.15:

2022-07-23 11:52:24.242  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : Starting ChatApplication v0.0.1-SNAPSHOT using Java 11.0.15 on ce40804ee34d with PID 1 (/application/chat-app/chat-application.jar started by java_user in /application/chat-app)

而我的日志显示Java 11.0.16:

2022-07-21 16:08:42.203  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : Starting ChatApplication v0.0.1-SNAPSHOT using Java 11.0.16 on c6dfab6ed849 with PID 1 (/application/chat-app/chat-application.jar started by java_user in /application/chat-app)

鉴于 JVM 是由容器决定的,我并不清楚它们为什么不同。也许这是(部分)问题?也可能是 IDE。它适用于 IntelliJ IDEA 2021.2.2 Ultimate Edition。你使用的是哪个版本?

1

可能是,所以我正在使用最近更新的 IntelliJ IDEA 2022.1.4(终极版),但重新尝试后得到了相同的结果。

6

我已升级到 IntelliJ IDEA 2022.1.4,现在可以重现该问题。当我在更改其值后触发重建时,它VERIFY_MSG尝试上传 1 个类资源,但失败了:

2022-07-27 11:35:25.686  INFO 62132 --- [   File Watcher] o.s.b.d.r.c.ClassPathChangeUploader      : Uploaded 1 class resource
2022-07-27 11:35:27.104  WARN 62132 --- [   File Watcher] o.s.b.d.r.c.ClassPathChangeUploader      : A failure occurred when uploading to http://localhost:8120/.~~spring-boot!~/restart. Upload will be retried in 2 seconds

发生故障时,远程应用程序会记录以下内容:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.6)

2022-07-27 10:35:25.796  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : Starting ChatApplication v0.0.1-SNAPSHOT using Java 11.0.16 on a9533096f7e2 with PID 1 (/application/chat-app/chat-application.jar started by java_user in /application/chat-app)
2022-07-27 10:35:25.796  INFO 1 --- [  restartedMain] com.chatapplication.ChatApplication      : No active profile set, falling back to 1 default profile: "default"
2022-07-27 10:35:26.130  INFO 1 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8120 (http)
2022-07-27 10:35:26.131  INFO 1 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-07-27 10:35:26.131  INFO 1 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.60]
2022-07-27 10:35:26.134  INFO 1 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-07-27 10:35:26.134  INFO 1 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 334 ms
2022-07-27 10:35:26.161  WARN 1 --- [  restartedMain] .s.b.d.a.RemoteDevToolsAutoConfiguration : Listening for remote restart updates on /.~~spring-boot!~/restart
2022-07-27 10:35:26.168  WARN 1 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'chatController' defined in URL [jar:file:/application/chat-app/chat-application.jar!/BOOT-INF/classes!/com/chatapplication/controller/ChatController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'otherService': Resolution of declared constructors on bean Class [com.chatapplication.service.v2.OtherService] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@21436b81] failed; nested exception is java.lang.NoClassDefFoundError: com/chatapplication/service/v2/VerificationService
2022-07-27 10:35:26.168  INFO 1 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2022-07-27 10:35:26.176  INFO 1 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-07-27 10:35:26.203 ERROR 1 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'chatController' defined in URL [jar:file:/application/chat-app/chat-application.jar!/BOOT-INF/classes!/com/chatapplication/controller/ChatController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'otherService': Resolution of declared constructors on bean Class [com.chatapplication.service.v2.OtherService] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@21436b81] failed; nested exception is java.lang.NoClassDefFoundError: com/chatapplication/service/v2/VerificationService
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.18.jar!/:5.3.18]
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.18.jar!/:5.3.18]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) ~[spring-beans-5.3.18.jar!/:5.3.18]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) ~[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.ChatApplication.main(ChatApplication.java:10) ~[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: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'otherService': Resolution of declared constructors on bean Class [com.chatapplication.service.v2.OtherService] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@21436b81] failed; nested exception is java.lang.NoClassDefFoundError: com/chatapplication/service/v2/VerificationService
    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.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.18.jar!/:5.3.18]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1389) ~[spring-beans-5.3.18.jar!/:5.3.18]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309) ~[spring-beans-5.3.18.jar!/:5.3.18]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.18.jar!/:5.3.18]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.18.jar!/:5.3.18]
    ... 24 common frames omitted
Caused by: java.lang.NoClassDefFoundError: com/chatapplication/service/v2/VerificationService
    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]
    ... 37 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.chatapplication.service.v2.VerificationService
    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]
    ... 41 common frames omitted

现在看看我是否可以弄清楚为什么它仅在特定版本的 IntelliJ IDEA 中失败。

3

在 IntelliJ IDEA 的较新版本中,更新类文件的方式似乎已经发生了改变。

当我更改VerificationService并触发重建时,VerificationService.class文件被删除。 DevTools 的文件观察器注意到此更改并上传一个ClassLoaderFile.Kind.DELETEDfor VerificationService.class。 接收端删除该类并触发重新启动。 然后由于缺少类,重新启动失败。

可以通过调整重启前所需的静默期来避免此问题。以下方法对我有用:

spring:
  devtools:
    remote:
      secret: mysecret
    restart:
      quiet-period: 800ms

这里存在可用性问题,因为这个问题不容易弄清楚。也许我们应该记录更多关于变化的信息?与其只记录以某种方式发生变化的类资源数量,不如按变化类型进行细分,这样会更有帮助。

我还想知道,当上传失败触发重启时,行为是否可以改进。目前,重启失败会导致应用程序退出。RemoteSpringApplication然后无限期地重试上传,无法连接到应用程序。实际上并不是上传失败,而是应用程序对该上传的响应。据推测,如果它保持运行并且RemoteSpringApplication能够上传ADDED更改VerificationService,那么后续重启可能会成功。

3

嗯,我之前确实尝试过设置静默期,当时按照文档Spring Boot Docs - 配置文件系统观察器, 但当时我无法解决问题,现在我尝试将其设置为 900ms,这个方法有效,我刚尝试过 800ms,遇到了同样的问题。我担心的是,这似乎是 IDE 特有的,因此将其永久添加到应用程序的主配置中并不是一个好习惯。

关于注销更新的类,我确实认为进行细分会很有帮助。我很惊讶应用程序退出了,因为如果没有设置适当的静默期来避免这种情况,这将成为一个问题(除非设置一个高值来尝试覆盖所有情况,否则每台机器的情况可能会有所不同)。因此需要手动重新启动服务。

9

感谢您尝试调整静默期。很高兴听到增加静默期也能为您解决问题。

我担心这似乎是 IDE 特有的,因此将其永久地添加到应用程序的主配置中并不是一个好的做法。

您可能需要在适合您的本地开发环境(IDE 等)的全局设置文件中配置静默期。

7

团队讨论了这个问题,我们认为应该添加更多日志信息 - 最初是一行,说明有多少添加/删除/更改被推送到服务器。在这种情况下,这将是有关该类被删除+添加的一个很好的线索。我们以后可以考虑更详细的日志消息。

我们还讨论了更改重启的默认值"quiet-period",但这看起来非常特定于设置,很难想到一个适合所有情况的值。

9

我添加了一些信息级日志,以概述即将上传的更改。当静默期太短且修改显示为删除后添加时,这些消息如下所示:

2022-07-28 14:06:27.242  INFO 17791 --- [   File Watcher] o.s.b.d.r.c.ClassPathChangeUploader      : Uploading 1 class path change (0 additions, 1 deletion, 0 modifications)
2022-07-28 14:06:28.672  INFO 17791 --- [   File Watcher] o.s.b.d.r.c.ClassPathChangeUploader      : Uploading 1 class path change (1 addition, 0 deletions, 0 modifications)

第二次上传失败,因为第一次上传触发了重新启动,而重新启动由于缺少类而失败。结果,我们看到了现有的警告级别日志:

2022-07-28 14:06:28.673  WARN 17791 --- [   File Watcher] o.s.b.d.r.c.ClassPathChangeUploader      : A failure occurred when uploading to http://localhost:8120/.~~spring-boot!~/restart. Upload will be retried in 2 seconds

我还对本地开发工具做了类似的更改,现在在触发重新启动时会记录如下消息:

2022-07-28 13:58:39.653  INFO 15625 --- [   File Watcher] rtingClassPathChangeChangedEventListener : Restarting due to 1 class path change (1 addition, 0 deletions, 0 modifications)