【问题标题】:spring-boot-devtools reload of multi-module maven project changesspring-boot-devtools 重载多模块maven项目变更
【发布时间】:2016-12-24 04:58:08
【问题描述】:

多模块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 kbd>+F9)) spring-boot 自动重新启动应用程序并添加更改。 submodule_6 或 submodule_7 发生的更改不会触发自动重启。


问题

  1. 有没有办法让您在 submodule_6 或 submodule_7 中进行更改时强制重启并应用更改?
  2. Spring-boot-devtools 使用两个类加载器:“基本类加载器”和“重启类加载器”。是这样在应用程序的初始启动时 submodule_6 和 submodule_7 被添加到“基本类加载器”中,而 submodule_5 被保留在“重新启动类加载器”中吗?让它每当 submodule_5 强制重新启动时,它都会使用“The Base Classloader”中的 submodule_6 和 submodule_7 的版本?

【问题讨论】:

  • StackOverflow 上的答案不能这样工作,当有人给您正确答案时,您只需检查一下,它就会出现在顶部并带有“正确标记”。查看其他问题

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


【解决方案1】:

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

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

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

【讨论】:

  • 我也遇到过这个。我的问题是,是否有办法使用注释或类似的东西来做到这一点。如果触发了重启,我认为它不仅仅取决于 maven 的表现如何。是否配置为在 submodule_5 重新启动时也构建 submodule_6 和 submodule_7?
  • 刚刚试了一下,效果很好!我相信它起作用的原因是因为 spring-boot:run 直接从项目的文件夹(而不是生成的工件)读取编译的类和资源。我将另一个模块文件夹添加到监视文件夹中。我在另一个模块中修改了一个类,应用程序重新启动,我可以看到修改。
  • 我也试过了,对我来说重启发生了,但没有应用更改。我读过从命令行和在 IDE 中工作可能会有所不同。请问您是如何运行您的应用程序的,我是从命令行完成的。它检测到进行了更改。它重新启动了应用程序,但没有应用更改。当您在 IDE 中工作时,它的工作方式可能会有所不同。
  • 我是从 Eclipse 中完成的,它有时间在重启之前将修改后的 .java 重新构建为 *.class
【解决方案2】:

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

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

IntelliJspring-boot 似乎可以很好地协同工作。首先它对我不起作用的原因是因为我一开始是从命令行工作的。

命令行和IDE的区别

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

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

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

额外

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

【讨论】:

    【解决方案3】:

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

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

    在命令行上执行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中添加带有标志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):

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

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 2015-10-10
      • 2014-06-02
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2017-02-02
      • 1970-01-01
      相关资源
      最近更新 更多