为了改善开发人员体验,我尝试包含 Spring Dev Tools。
我的设置:
- 多个模块
- 摇篮 6.6
- 春季启动 2.4.2
- 百里香叶
- 使用 Webpack 响应子页面
我使用带有一个settings.gradle
文件和一个子模块的多项目 gradle 构建,该子模块也具有 spring boot bootJar
。在那个build.gradle
文件中,我添加了这一developmentOnly("org.springframework.boot:spring-boot-devtools")
行。
IntelliJ 配置
我通过 IntelliJ 启动我的应用程序:
我还在“设置>编译器”设置以及“compiler.automake.allow.when.app.running”中启用了“自动构建项目”。
什么有效
当我启动应用程序时,我会看到日志消息
[2021-03-17 14:18:02.001] INFO [restartedMain] --- o.s.b.d.a.OptionalLiveReloadServer: LiveReload server is running on port 35729
说明我的 LiveReloadServer 已启动。
当我在我的 Java 文件中应用更改时,会触发构建和重新启动,因此更改的重新启动确实有效 - 虽然速度很慢 - 即使我只是更改 Java 类中的一行,重建至少需要 15 秒。
什么不起作用
当我将更改应用到我的 HTML、CSS 或 JS 文件或我的 react 应用程序时,只有在项目重建后才会反映更改。我所有的资源都在默认resources/static
文件夹中,因此它们应该由 dev-tools reload 处理。
仅供参考,我将我的 react-app 与 webpack 打包在一起,当我开始webpack watch
任务时,它会在我应用更改时正确重建我的 bundle.js。
我确实有一个自定义 ResourceRegistryHandler 设置,也许这是问题的一部分,即使我不明白为什么:
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
boolean devMode = this.env.acceptsProfiles(Profiles.of("dev"));
boolean useResourceCache = !devMode;
final String[] pathPatterns = Arrays.stream(RESOURCE_FOLDERS).map(f -> f + FOLDER_SUFFIX)
.toArray(String[]::new);
final String[] resourceLocations = Arrays.stream(RESOURCE_FOLDERS).map(f -> CLASSPATH_PREFIX + f)
.toArray(String[]::new);
if (useResourceCache) {
resourceProperties.getCache().setPeriod(Duration.of(365, ChronoUnit.DAYS));
registry.addResourceHandler(pathPatterns)
.addResourceLocations(resourceLocations)
.setCachePeriod((int) Duration.of(365, ChronoUnit.DAYS).getSeconds())
.resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"))
.addTransformer(new CssLinkResourceTransformer());
} else {
resourceProperties.getCache().setPeriod(Duration.of(0, ChronoUnit.DAYS));
registry.addResourceHandler(pathPatterns)
.addResourceLocations(resourceLocations)
.setCachePeriod(0)
.resourceChain(false);
}
}
实时重新加载
除了静态资源根本没有刷新这一事实之外,我还想知道如何使用 live reload chrome 插件,因为Cannot download livereload.js
当我想要启用我的 live reload 浏览器插件时,我总是会收到一个弹出窗口。
我的问题
- 如何让 Spring 刷新静态资源?他们甚至不会在重新加载页面时为我刷新,只有在触发并完成重启后
- 我怎样才能让它与 Live Reload 一起使用?
我也很感激任何关于为什么我的项目构建可能需要那么长时间的任何提示,即使有这么小的变化,我可能会检查 gradle 构建扫描。