14

重载多模块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 使用两个类加载器:“基本类加载器”和“重启类加载器”。是这样在应用程序的初始启动时 submodule_6 和 submodule_7 被添加到“基本类加载器”中,而 submodule_5 被保留在“重新启动类加载器”中吗?使得每当 submodule_5 强制重新启动时,它都会使用“基本类加载器”中的 submodule_6 和 submodule_7 的版本?
4

3 回答 3

6

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

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

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

于 2016-08-17T15:23:56.170 回答
4

为了解决这个问题,我开始在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 并将 jars 添加到 submodule_5 的构建中。每当在 submodule_6 和 submodule_7 中进行更改时,spring-boot 甚至都不会注意到,因为它只在看 submodule_5 并且有它需要的 jars。即使您特别告诉它也监视那些子模块,它仍然不会重建那些,它只会继续使用它已经在“基本类加载器”中加载的 jar(这是我的假设,我不是 100 %确定它的工作方式)。

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

额外的

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

于 2016-08-19T10:08:50.833 回答
1

我试过了 spring.devtools.restart.additional-paths,但无论如何它都没用:源更改重新启动应用程序但无能为力,因为应用程序在执行期间没有模块的目标/类。

spring-boot:run最近的 IntelliJ 版本上执行:它开箱即用。

spring-boot:run命令行上执行:至少有两种情况。

案例 1)我们想spring-boot:run从具有 spring boot 主类的模块执行(submodule_5在 op 问题中)。我们需要在其 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 中添加带有标志 skip 的 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(submodule_5在op问题中):

 <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 之后将其应用于其依赖项(而 multi/parent pom.xml 中的跳过标志)。

于 2021-04-24T12:34:48.990 回答