spring-boot-devtools重新加载多模块maven项目的变化

重新加载多模块maven项目的变化


设置

想象一下多模块maven项目。 项目结构是:

pom.xml //parentpom | pom.xml //submodule_1 | pom.xml //submodule_2 . . . pom.xml //submodule_7 

例如,submodule_5将submodule_6和submodule_7作为依赖项。 可以构建submodule_5以构造可以部署的War-file。 只要submodule_5的类路径发生变化, Spring-Boot-Devtools就会提供自动重启function。

每当使用以下命令运行应用程序时:

 mvn spring-boot:run 

并且对submodule_5进行了更改(取决于您使用类路径的IDE变更。(对于Eclipse自动/对于InteliJ,当按Ctrl + F9时 ))spring-boot自动重启应用程序并添加更改。 发生在submodule_6或submodule_7上的更改不会触发自动重启。


问题

  1. 是否有办法使它无论何时你在submodule_6或submodule_7中进行更改以强制重启并在那里应用更改?
  2. Spring-boot-devtools使用两个类加载器:“Base Classloader”和“Restart Classloader”。 是否应该在初始启动应用程序时将submodule_6和submodule_7添加到“Base Classloader”,而submodle_5保存在“The Restart Classloader”中? 这样,每当submodule_5强制重启时,它都会使用“The Base Classloader”中的submodule_6和submodule_7版本?

您可以在application.properties中指定spring-boot-devtools要监视的其他文件夹:

 spring.devtools.restart.additional-paths=../submodule_6,../submodule_7 

请参阅Spring关于using-boot-devtools-restart-additional-paths的文档。

为了解决这个问题,我开始从InteliJ中运行应用程序。 无需添加。

 spring.devtools.restart.additional-paths=../submodule_6,../submodule_7 

IntelliJspring-boot似乎很好地协同工作。 它首先不适合我的原因是因为我最初是从命令行工作的。

命令行和IDE之间的区别

所以spring-boot-devtools使用两个类加载器来加载应用程序。 Jars将被加载到“Base classloader”中,您的应用程序将被加载到“restart classloader”中。 每当类路径发生更改时,最后一个类加载器将重新启动。

每当从命令行运行submodule_5时,它将构建submodule_6和submodule_7并将jar添加到submodule_5的构建中。 每当在submodule_6和submodule_7中进行更改时,spring-boot甚至都不会注意到,因为它只是在观看submodule_5并且有所需的jar。 即使你特意告诉它也要看那些子模块,它仍然不会重建那些,它只会继续使用它已经加载到“基础类加载器”中的jar子(这是我的假设,我不是100它确实有效的方式)。

每当从IDE运行submodule_5时,它都不会创建submodule_6和submodule_7的jar。 它只会使用他们的类路径。 这使得你的intire项目的类路径(所有子模块)中的更改将触发自动重启,并将应用更改。

额外

每当从IDE运行时更改为html文件,css文件,xml文件等资源。 。 。 不会触发重启,因为这不是类路径中的更改。 但这些变化仍然可见。