spring-boot - Spring Boot Dev Tools/Live Reloading - 静态资源刷新不起作用

标签 spring-boot gradle livereload spring-boot-devtools

为了改善开发人员体验,我尝试包含 Spring Dev Tools。

我的设置:

  • 多个模块
  • Gradle 6.6
  • Spring 启动 2.4.2
  • 百里香
  • 与子页面的 Webpack react

我使用一个带有 settings.gradle 文件和一个子模块的多项目 gradle 构建,该子模块也有 spring boot bootJar。在 build.gradle 的文件中,我添加了 developmentOnly("org.springframework.boot:spring-boot-devtools") 行。

IntelliJ 配置

我通过 IntelliJ 启动我的应用程序:

enter image description here

我还在“设置 > 编译器”设置以及“compiler.automake.allow.when.app.running”中启用了“自动构建项目”。

什么有效

当我启动应用程序时,我看到了日志消息

[2021-03-17 14:18:02.001] INFO [restartedMain] --- o.s.b.d.a.OptionalLiveReloadServer:LiveReload 服务器正在端口 35729 上运行

声明我的 LiveReloadServer 已启动。

当我在我的 Java 文件中应用更改时,会触发构建和重新启动,因此更改后重新启动确实有效 - 虽然它非常慢 - 即使我只更改 Java 类中的一行,重建也需要 15 秒最少。

什么不起作用

当我将更改应用到我的 HTML、CSS 或 JS 文件或我的 React 应用程序时,更改仅在项目重建后才会反射(reflect)出来。我所有的资源都在默认的 resources/static 文件夹中,因此它们应该由 dev-tools reload 处理。

仅供引用,我用 webpack 打包我的 react-app,当我启动 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 当我想启用我的实时重载浏览器插件。

我的问题

  • 如何让 Spring 刷新静态资源?他们甚至不会为我刷新页面,只有在触发并完成重启后才会刷新
  • 如何让它与 Live Reload 一起使用?

我也很感激任何关于为什么我的项目构建可能需要这么长时间的提示,即使有那么小的更改,我可能会检查 gradle 构建扫描。

最佳答案

关于

How can I get this to work with Live Reload?

我有同样的问题和类似的设置。使用由 webpack 构建的 React 前端并将输出复制到/target/classes/static 文件夹中。我还使用了 live reload chrome 插件。

我注意到有时实时重新加载有效,有时无效。实时重载服务器始终处于启动状态,我可以从中下载 livereload.js。 但是插件总是提示无法下载文件。

在它工作的零星案例之一中,我注意到在 chrome html 检查器中有一个标记注入(inject)了对 livereload.js 的引用。当实时重新加载不工作时,注入(inject)的脚本标签丢失。

事实证明,所有实时重新加载 chrome 插件所做的,都是注入(inject)对 .js 文件的引用,但这几乎不起作用。

所以我继续将它添加到我的 thyleaf 模板中

<script th:if="${@environment.acceptsProfiles('dev')}" src="http://localhost:35729/livereload.js"></script>

有了它,它一直在工作。之后我卸载了 chrome 插件。

长见识

要使实时重新加载工作,您需要在您的机器上运行实时重新加载服务器和 html 中的实时重新加载客户端(来自服务器的 livereload.js)

<script src="http://localhost:35729/livereload.js"></script>

Livereload.js Github

关于spring-boot - Spring Boot Dev Tools/Live Reloading - 静态资源刷新不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66675503/

相关文章:

android - 将gradle从3.4升级到3.5会在生成的DataBindingClasses中抛出 “error: cannot find symbol class”和 “error: package … does not exist”

javascript - 在服务器进程完成重启之前 gulp-livereload 重新加载

css - Angular 2 即时 CSS 重新加载

spring-boot - Spring 启动 log4j 模式

java - Spring Boot MSSQL Kerberos 身份验证

java - 如何从父项目获取源作为依赖项

node.js - 实时重新加载无法与 ember-cli 一起使用

Spring Boot 应用程序特定的外部属性

java - 来自现有 JSON 的 Springfox Swagger Ui

gradle - Gradle 如何解析 Gradle 插件门户中未列出的插件?