簡體   English   中英

spring-boot-devtools 重載多模塊 maven 項目變更

[英]spring-boot-devtools reload of multi-module maven project changes

重載多模塊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 版本?

您可以在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使用兩個類加載器來加載一個應用程序。 罐將在“基礎類加載器”,你的應用程序將在“重啟類加載器”加載被加載 每次類路徑發生更改時,最后一個類加載器都會重新啟動。

每當從命令行運行 submodule_5 時,它將構建 submodule_6 和 submodule_7 並將 jar 添加到 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 等資源。 . . 不會觸發重新啟動,因為這不是類路徑中的更改。 但這些變化仍然是可見的。

我嘗試使用spring.devtools.restart.additional-paths ,無論如何它都沒用:源更改重新啟動應用程序但無能為力,因為應用程序在執行過程中沒有目標/模塊類。

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

在命令行上執行spring-boot:run :至少有兩種情況。

情況 1)我們想從具有 spring boot 主類(操作問題中的submodule_5 )的模塊執行spring-boot:run 我們需要在其 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主類(op問題中的submodule_5 )的模塊的pom.xml中添加:

 <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 中的跳過標志)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM