为何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实现自动刷新
- 添加DevTools依赖
修改build.gradle.kts,引入DevTools:
dependencies { developmentOnly("org.springframework.boot:spring-boot-devtools") }
DevTools会自动监听classpath变化,触发应用重启或静态资源刷新。
- 开启IJ自动构建
- 打开
File > Settings > Build, Execution, Deployment > Compiler,勾选Build project automatically - 按
Ctrl+Shift+A搜索Registry,找到compiler.automake.allow.when.app.running并勾选
- 配置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输出目录加载静态资源:
- 修改Vite配置
在vite.config.js中调整输出目录(假设Vite代码在项目根目录的ui子目录):
export default { build: { outDir: '../dist', // 输出到项目根目录的dist文件夹 } }
- 配置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同步任务:
- 添加同步任务
在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
相关产品推荐
相关产品推荐

