想象一下多模块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文件。 Spring-Boot-Devtools 只要submodule_5的类路径发生变化,就会提供自动重启功能。
每当使用以下命令运行应用程序时
mvn spring-boot:run
对submodule_5进行了更改(取决于您使用类路径的IDE被更改。(对于 Eclipse 自动/对于 InteliJ ,当按 Ctrl + F9 ))spring-boot自动重启应用程序并添加更改。发生在submodule_6或submodule_7上的更改不会触发自动重启。
答案 0 :(得分:4)
您可以在 application.properties 中指定spring-boot-devtools要监视的其他文件夹:
spring.devtools.restart.additional-paths=../submodule_6,../submodule_7
参见Spring关于using-boot-devtools-restart-additional-paths的文档。
答案 1 :(得分:3)
要解决此问题,我开始在 InteliJ 中运行该应用程序。无需添加。
spring.devtools.restart.additional-paths=../submodule_6,../submodule_7
IntelliJ 和 spring-boot 似乎非常合作。它起初不适合我的原因是因为我最初是从命令行工作的。
所以 spring-boot-devtools 使用两个类加载器来加载应用程序。 Jars将在“Base classloader”中加载 1 ,您的应用程序将加载到“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项目的类路径(所有子模块)中的更改将触发自动重启,并且将应用更改。
<强> EXTRA 强>
每当从IDE运行时,都会更改为html-files,css-files,xml-files等资源。 。 。不会触发重启,因为这不是类路径中的更改。但这些变化仍然可见。
答案 2 :(得分:0)
我尝试使用 spring.devtools.restart.additional-paths
,但无论如何它都没用:源更改重新启动应用程序但无能为力,因为应用程序在执行期间没有目标/模块类。
在最近的 IntelliJ 版本上执行 spring-boot:run
:它开箱即用。
在命令行上执行 spring-boot:run
:至少有两种情况。
案例 1)我们想要从具有 spring boot 主类(操作问题中的 spring-boot:run
)的模块中执行 submodule_5
。
我们需要在其 pom.xml 的插件配置中添加我们希望 spring-boot 插件知道的已编译类的附加类路径:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<folders>
<folder>
../submodule_6/target/classes
</folder>
<folder>
../submodule_7/target/classes
</folder>
</folders>
</configuration>
</plugin>
</plugins>
</build>
案例 2) 我们想从父模块执行 spring-boot:run
。
它仅适用于也是模块父级的 pom 多模块。
我们需要做两个改变:
首先,在父 pom 中添加带有标志跳过的 spring boot 插件声明:
`<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>`
然后在有spring boot主类的模块的pom.xml中添加(op问题中的submodule_5
):
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
</build>
我们现在可以从父 pom 启动应用程序:
mvn -pl submodule_5 -am spring-boot:run
仅供参考,这些 maven 标志指定在将目标应用于其依赖项后将目标应用于 submodule_5(而多/父 pom.xml 中的跳过标志)。