Spring Boot Devtools 如何在独立模块中重新加载 Maven 多个依赖模块?



我有一个具有以下结构的多模块Maven:

app-parent
-------app-library (Hibernate data entities layer)
-------app-main (contains app-library as dependency), Spring Boot web application.

这些文件夹的简单pom.xml文件:

  • 应用父/pom.xml
<modules>
<module>app-library</module>
<module>app-main</module>
</modules>
<packaging>pom</packaging>
<name>app-parent</name>
  • 应用程序库/pom.xml
<parent>
<groupId>test</groupId>
<artifactId>app-parent</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
.... Some libraries here ....
</dependencies>
  • app-main/pom.xml
<parent>
<groupId>test</groupId>
<artifactId>app-parent</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>            
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>petascope-core</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

在NetBeans 8.2 和 Spring Boot 1.5.2 版本中,我使用 Spring Devtools 自动重新加载更改的 Java 类文件(~几秒钟(,而不是冷重启(> 10 秒(。

在应用程序主文件夹上,我运行以下命令来设置 Web应用程序,它允许 NetBeans 将调试器附加到端口 5005

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

另外,在 application.properties of app-main/src/main/resources 中,我添加了这个手表,以允许 Spring Devtools 检测来自 app-library 的更改。

spring.devtools.restart.additional-paths=../app-library

因此,每当我在app-main或app-library中更改一个java文件时,我都可以从终端中看到Spring DevTool在几秒钟内完成重新加载。

.   ____          _            __ _ _
/\ / ___'_ __ _ _(_)_ __  __ _    
( ( )___ | '_ | '_| | '_ / _` |    
\/  ___)| |_)| | | | | || (_| |  ) ) ) )
'  |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::        (v1.5.2.RELEASE)
INFO [08:57:20] ApplicationMain@48: Starting ApplicationMain on localhost.localdomain with PID 19645 (/home/rasdaman/rasdaman_community/build/applications/petascope/target/petascope_main/classes started by rasdaman in /home/rasdaman/rasdaman_community/rasdaman/applications/petascope/petascope_main)
DEBUG [08:57:20] ApplicationMain@51: Running with Spring Boot v1.5.2.RELEASE, Spring v4.3.7.RELEASE
INFO [08:57:20] ApplicationMain@637: No active profile set, falling back to default profiles: default
[2018-05-01 08:57:22.341] - 19645 INFO [restartedMain] --- org.apache.catalina.core.StandardService: Starting service Tomcat
[2018-05-01 08:57:22.341] - 19645 INFO [restartedMain] --- org.apache.catalina.core.StandardEngine: Starting Servlet Engine: Apache Tomcat/8.5.11
[2018-05-01 08:57:22.361] - 19645 INFO [localhost-startStop-1] --- org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/rasdaman]: Initializing Spring embedded WebApplicationContext
INFO [08:57:24] ApplicationMain@57: Started ApplicationMain in 3.612 seconds (JVM running for 84.418)

问题在于应用程序库方法中的一些基本更改,Spring DevTools 可以检测到文件已被保存并重新加载,但从调用此方法的 app-main 中,输出仍然相同,例如:

app-library
public class Service {
public String returnValue() {
// return "Value before Spring DevTools reload.";
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// After app-main was set up from Maven command lines, I changed this line here and saved it to notice Spring DevTool to reload in the console.
return "Value after Spring DevTools reload."
}
}
app-main
public class TestService {
public TestService() {
Service service = new Service();
// !!!!!!!!!!!!!!!!!!!
// It can only print "Value before Spring DevTools reload."
// even though the Service file has been changed to return different value and Spring DevTools reloaded.
System.out.println(service.returnValue());
}
}

有了这个问题,我不能只在应用程序库中进行更改,并期望更改将应用于应用程序主。相反,我必须停止 Maven 命令行,然后在 NetBeans 中单击 app-main 并选择">使用依赖项生成",然后再次运行 Maven 命令行以冷启动设置此 Web 应用程序(总计:~1 分钟(。

我可以做些什么来使Spring DevTools可以在我将文件保存在应用程序库中后立即将更改从应用程序库应用到应用程序主库?这将有助于减少 NetBeans"使用依赖关系构建"的等待时间。

因此,在 app-main 中,它需要在本地存储库 (~/.m2/...( 中构建应用程序库,更新此存储库的唯一方法是转到应用程序库文件夹并运行:

mvn install

之后,从命令行 (ctrl+c( 停止正在运行的 Web 应用程序,并在 app-main 文件夹上使用相同的 maven 命令重新启动它:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

冷重启应用程序主仍然需要时间,但这是可以接受的。

最新更新