![](/img/trans.png)
[英]multi-module maven spring boot project with n levels of dependencies
[英]spring-boot-devtools reload of multi-module maven project changes
想象一個多模塊的 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 上的更改不會觸發自動重啟。
您可以在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
IntelliJ和spring-boot似乎很好地協同工作。 它最初對我不起作用的原因是因為我一開始是從命令行工作的。
所以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.