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

时间:2016-08-17 13:37:10

标签: java spring maven spring-boot spring-boot-maven-plugin

重新加载多模块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文件。 Spring-Boot-Devtools 只要submodule_5的类路径发生变化,就会提供自动重启功能。

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

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”& “重启类加载器”。是否应该在初始启动应用程序时将submodule_6和submodule_7添加到“Base Classloader”,而submodle_5保存在“The Restart Classloader”中?这样,只要submodule_5强制重启,它就会使用“The Base Classloader”中的submodule_6和submodule_7版本?

3 个答案:

答案 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 似乎非常合作。它起初不适合我的原因是因为我最初是从命令行工作的。

命令行与IDE的区别

所以 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 中的跳过标志)。