spring-boot-devtools自动重启不起作用
我有一个使用 mvn 构建的有效 Spring Boot 2.25 应用程序。根据此文档,我添加
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
从文档:
由于 DevTools 监控类路径资源,触发重启的唯一方法是更新类路径。更新类路径的方式取决于您使用的 IDE。在 Eclipse 中,保存修改后的文件会导致更新类路径并触发重新启动。在 IntelliJ IDEA 中,构建项目(Build -> Build Project)具有相同的效果。
随着应用程序的运行,我尝试了一个简单的
touch /path/to/app.jar
期待应用程序重新启动,但什么也没发生。
好吧,也许它正在做一些更聪明的事情。我修改了一些源 .java,重新编译了 .jar,然后用cp它来替换正在运行的 .jar 文件,然后……什么也没发生。
也来自文档
DevTools 依靠应用程序上下文的关闭挂钩在重新启动期间关闭它。如果您禁用了关闭钩子 (SpringApplication.setRegisterShutdownHook(false)),它就不能正常工作。
我不是在做这个。
DevTools 需要自定义ApplicationContext 使用的ResourceLoader。如果您的应用程序已经提供了一个,它将被包装。不支持直接覆盖 ApplicationContext 上的 getResource 方法。
我不是在做这个。
如果这很重要,我正在 Docker 容器中运行它。从文档:
运行完全打包的应用程序时,开发人员工具会自动禁用。如果您的应用程序是从 java -jar 启动的,或者是从特殊的类加载器启动的,则它被视为“生产应用程序”。如果这不适用于您(即,如果您从容器运行您的应用程序),请考虑排除 devtools 或设置 -Dspring.devtools.restart.enabled=false 系统属性。
我不明白这意味着什么,或者它是否相关。
我想重新编译一个 .jar 并在正在运行的 docker 容器中替换它,并在不重新启动容器的情况下触发和应用程序重新启动。我怎样才能做到这一点?
编辑:我正在使用mvn重建 jar,然后docker cp在正在运行的容器中替换它。(IntelliJ IDEA 声称要重建项目,但实际上并未触及jar 文件,但那是另一回事了。)我正在寻找非 IDE 特定的解决方案。