【问题标题】:Spring Boot Dev Tools / Live Reloading - refresh of static resources is not workingSpring Boot Dev Tools / Live Reloading - 静态资源的刷新不起作用
【发布时间】:2021-06-14 22:24:33
【问题描述】:

为了改善开发者体验,我尝试加入 Spring Dev Tools。

我的设置:

  • 多个模块
  • Gradle 6.6
  • Spring Boot 2.4.2
  • 百里香
  • 使用 Webpack 响应子页面

我使用带有settings.gradle 文件的多项目gradle 构建和一个也具有弹簧启动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 处理。

仅供参考,我使用 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 插件,因为当我想启用我的 live reload 浏览器插件时,我总是得到一个弹出窗口,指出 Cannot download livereload.js .

我的问题

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

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

【问题讨论】:

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


    【解决方案1】:

    我也在寻找这个问题的答案!

    【讨论】:

    • 我们让它为我们工作。我们必须精简我们的 gradle 构建,但现在它按预期工作 - 每当我们更改文件并在 IntelliJ 中按 Ctrl+Shift+F9 时,它会重新启动服务器(如果需要),或者仅在仅刷新静态资源时触发实时重新加载。但是,仅在按下“Ctrl+Shift+F9”时,我才删除了 IntelliJ 配置中的所有“更新类和资源”,因为它们过于频繁地触发了重启。
    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多