You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Gradle不显示更新后的src/main/resources/static?如何实现自动同步?

Spring Boot + Vite 静态资源自动同步配置方案

问题背景

在spring-kotlin-websocket-oauth-example的ADD_UI分支中,使用Vite构建UI并将产物输出至/app/src/main/resources/static,执行npm run build:watch能更新静态文件,但Spring应用需重启才会生效,需配置Gradle实现文件更新时自动同步,当前环境为Windows系统+IJ运行器,gradle bootRun未生效。

方案一:结合Spring Boot DevTools实现自动刷新

  1. 添加DevTools依赖
    修改build.gradle.kts,引入DevTools:
dependencies {
    developmentOnly("org.springframework.boot:spring-boot-devtools")
}

DevTools会自动监听classpath变化,触发应用重启或静态资源刷新。

  1. 开启IJ自动构建
  • 打开File > Settings > Build, Execution, Deployment > Compiler,勾选Build project automatically
  • 按Ctrl+Shift+A搜索Registry,找到compiler.automake.allow.when.app.running并勾选
  1. 配置Gradle监听静态资源
    在build.gradle.kts中添加资源监听配置,确保静态文件变化时触发processResources任务:
tasks.processResources {
    inputs.dir("$projectDir/app/src/main/resources/static")
    outputs.dir("$buildDir/resources/main/static")
}

tasks.bootRun {
    dependsOn(tasks.processResources)
    continuous(true) // 启用持续构建模式
}

运行gradle bootRun --continuous,同时执行npm run build:watch,静态文件更新后DevTools会自动触发应用刷新。

方案二:让Spring Boot直接加载Vite构建目录(无需同步)

无需将Vite产物同步到resources/static,直接配置Spring Boot从Vite输出目录加载静态资源:

  1. 修改Vite配置
    在vite.config.js中调整输出目录(假设Vite代码在项目根目录的ui子目录):
export default {
  build: {
    outDir: '../dist', // 输出到项目根目录的dist文件夹
  }
}
  1. 配置Spring Boot静态资源路径
    在application.properties中添加:
spring.web.resources.static-locations=classpath:/static/,file:./dist/

此时Spring Boot会同时读取classpath:/static/和本地dist目录的静态资源,Vite的build:watch更新dist后,浏览器刷新即可看到最新内容,无需重启Spring应用。

方案三:Gradle同步任务自动同步Vite产物

若坚持要将Vite产物输出到resources/static,可创建Gradle同步任务:

  1. 添加同步任务
    在build.gradle.kts中注册同步任务:
// 同步Vite构建产物到resources/static
val syncViteOutput by tasks.registering(Sync::class) {
    from("$projectDir/ui/dist") // Vite的实际输出目录
    into("$projectDir/app/src/main/resources/static")
    inputs.dir("$projectDir/ui/dist") // 监听Vite输出目录变化
    outputs.dir("$projectDir/app/src/main/resources/static")
}

// 让processResources依赖同步任务
tasks.processResources {
    dependsOn(syncViteOutput)
}

// 配置bootRun持续构建
tasks.bootRun {
    continuous(true)
}

运行gradle bootRun --continuous和npm run build:watch,Vite产物更新时,同步任务会自动将文件复制到resources/static,DevTools检测到变化后触发应用刷新。

内容的提问来源于stack exchange,提问作者Jackie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:39:56