首页/新闻资讯/正文详情

Spring Boot整合Vue实现前后端单jar部署方案

发布时间:2026/9/23 15:46:35 来源:云帆数科 栏目:资讯中心
Spring Boot整合Vue实现前后端单jar部署方案
1. 项目背景与核心需求最近在重构公司一个老项目时遇到了前后端分离部署带来的协作效率问题。前端用Vue打包生成的dist需要单独部署到Nginx而后端是Spring Boot服务。每次联调测试时前端同学改个CSS样式都得重新部署一次Nginx后端接口有变动也得单独发版双方就像在玩打地鼠游戏。于是我们开始思考能否把前端静态资源直接打包进Spring Boot的jar包里这样就能实现单jar包部署运维同事狂喜接口和页面版本天然一致再也不用听到你刷新下缓存试试本地开发时localhost:8080直接访问告别CORS报错2. 技术方案选型2.1 资源存放位置选择经过对比三种常见方案我们最终选择了resources/static方案方案优点缺点resources/publicSpring Boot默认静态目录可能和已有API路径冲突resources/static优先级高于public需要手动配置资源映射resources/META-INF/resources兼容性最好目录结构较深维护不便关键配置示例// 防止静态资源被拦截 Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/**) .addResourceLocations(classpath:/static/); }2.2 构建工具集成2.2.1 Maven方案在pom.xml中添加frontend-maven-pluginplugin groupIdcom.github.eirslett/groupId artifactIdfrontend-maven-plugin/artifactId version1.12.1/version executions execution idinstall node and npm/id goals goalinstall-node-and-npm/goal /goals configuration nodeVersionv16.14.2/nodeVersion /configuration /execution execution idnpm install/id goals goalnpm/goal /goals phasegenerate-resources/phase /execution execution idnpm build/id goals goalnpm/goal /goals phasegenerate-resources/phase configuration argumentsrun build/arguments /configuration /execution /executions /plugin2.2.2 Gradle方案对于Gradle用户可以使用com.moowork.node插件plugins { id com.moowork.node version 1.3.1 } task appNpmInstall(type: NpmTask) { args [install] } task appNpmBuild(type: NpmTask) { args [run, build] } processResources.dependsOn appNpmBuild appNpmBuild.dependsOn appNpmInstall3. 完整实现流程3.1 前端项目改造修改vue.config.jsmodule.exports { publicPath: process.env.NODE_ENV production ? / : /, outputDir: ../backend/src/main/resources/static, indexPath: index.html, assetsDir: assets }解决路由冲突问题const router new VueRouter({ mode: history, base: process.env.BASE_URL, routes })重要提示一定要设置正确的publicPath否则会出现JS/CSS资源4043.2 后端项目调整添加统一入口控制器Controller public class FrontendController { GetMapping(value { /, /login, /dashboard/** // 所有前端路由路径 }) public String forward() { return forward:/index.html; } }配置静态资源缓存可选# application.properties spring.resources.cache.cachecontrol.max-age86400 spring.resources.cache.cachecontrol.no-cachefalse3.3 构建流程优化我们设计了多环境构建方案profiles profile iddev/id activation activeByDefaulttrue/activeByDefault /activation properties frontend.envdevelopment/frontend.env /properties /profile profile idprod/id properties frontend.envproduction/frontend.env /properties /profile /profiles对应前端package.jsonscripts: { build: vue-cli-service build --mode ${frontend.env} }4. 常见问题与解决方案4.1 资源加载404问题典型症状页面能打开但JS/CSS加载失败控制台报错Failed to load resource排查步骤检查jar包内容jar tvf target/xxx.jar | grep static确认资源路径是否正确检查Spring Security配置是否放行静态资源4.2 路由刷新白屏解决方案Configuration public class WebConfig implements WebMvcConfigurer { Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController(/{spring:\\w}) .setViewName(forward:/); registry.addViewController(/**/{spring:\\w}) .setViewName(forward:/); } }4.3 性能优化技巧开启Gzip压缩server.compression.enabledtrue server.compression.mime-typestext/html,text/css,application/javascript使用版本号控制缓存// vue.config.js configureWebpack: { output: { filename: js/[name].[hash:8].js, chunkFilename: js/[name].[hash:8].js } }5. 进阶实践5.1 动态配置方案有时候我们需要根据环境动态配置API地址// 在public目录下创建config.js window._env_ { API_URL: http://localhost:8080/api }; // 后端动态替换 Controller public class ConfigController { GetMapping(/config.js) public String getConfig(HttpServletRequest request) { return window._env_ JSON.toJSONString(config) ;; } }5.2 灰度发布方案通过Spring Boot的Profile实现AB测试Profile(!prod) Controller public class NewVersionController { GetMapping(/new-feature) public String newFeature() { return forward:/new-version/index.html; } }6. 监控与维护6.1 版本健康检查添加端点检查前端资源版本RestController RequestMapping(/api/version) public class VersionController { GetMapping public String getVersion() { try { Resource resource new ClassPathResource(static/version.txt); return StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8); } catch (IOException e) { return unknown; } } }6.2 构建耗时优化通过缓存node_modules提升CI速度# .gitlab-ci.yml cache: key: ${CI_PROJECT_ID} paths: - node_modules/ - frontend/node_modules/实际落地这个方案后我们的部署流程从原来的15分钟缩短到3分钟联调效率提升60%。不过要注意的是这种架构适合中小型项目对于超大型前端应用可能还是需要独立部署。

相关推荐

保卫萝卜炮塔介绍实战项目避坑3年经验
保卫萝卜炮塔介绍实战项目避坑3年经验

保卫萝卜炮塔介绍实战项目避坑3年经验 版本升级后 API 全变了,这种痛谁懂?我在做保卫萝卜炮塔介绍相关的实战项目时,刚把代码跑通,一升级依赖,报错刷屏,心态直接崩了。… · 2026/9/23 15:46:35

ArcGIS Python脚本中Exists函数的深度解析与应用
ArcGIS Python脚本中Exists函数的深度解析与应用

1. ArcGIS Python脚本开发:Exists函数深度解析与应用实战作为一名GIS开发工程师,我经常需要处理各种地理数据的检查和管理工作。arcpy.Exists()函数是我日常脚本中最常用的工具之一,它看似简单,但在实际项目中能帮我们避免很多潜在… · 2026/9/23 15:46:35

3招搞定qq头像带字的女生伤感,最佳实践避坑指南
3招搞定qq头像带字的女生伤感,最佳实践避坑指南

3招搞定qq头像带字的女生伤感,最佳实践避坑指南 学会语法却不知怎么搭项目,这是无数开发者卡在入门到实战之间的第一道坎。很多新人对着文档看了一周,代码能跑通,但一到真实场景就懵圈。特别是面对像【qq头像带字的女生伤感】这种看似简单实则细节满… · 2026/9/23 15:46:28

本地搭建Iceberg数据湖:Spark+Nessie+Minio实践指南
本地搭建Iceberg数据湖:Spark+Nessie+Minio实践指南

1. 项目整体设计与技术选型拆解先聊一个很现实的问题:每次想验证新想法、跑通一条新链路,最烦的是什么?是装环境。尤其是涉及数据湖、数据仓库这一套东西,动不动就是三台起跳的集群,加上各种权限、网络、配置&#xff… · 2026/9/23 22:16:20

华科834真题算法验证:PDF解析+NetworkX建模+Graphviz可视化
华科834真题算法验证:PDF解析+NetworkX建模+Graphviz可视化

简介:本资源为2019年华中科技大学硕士研究生入学考试《834计算机综合》真题完整试卷(PDF版),面向报考该校计算机相关专业的考研学生,聚焦数据结构、算法分析、操作系统基础及计算机网络核心考点的实战检验。试卷涵盖10… · 2026/9/23 22:16:14

脱硫和脱硝的区别与脱硫脱硝一体化选型(附工艺对比表)
脱硫和脱硝的区别与脱硫脱硝一体化选型(附工艺对比表)

开篇结论:脱硫和脱硝的区别:治理对象不同(SO₂和NOx),工艺路线不同(碱液喷淋和还原脱除)。脱硫脱硝一体化是系统集成不是单台设备。本文附两张对比表,帮你按工况选工艺。1. 脱硫与脱… · 2026/9/23 22:16:07

SAP拆解工单配置:S型工艺路线与成本独立归集实战
SAP拆解工单配置:S型工艺路线与成本独立归集实战

简介:本资源是面向SAP PP模块实施顾问、生产计划专员及FICO财务顾问的深度实操指南,系统解析SAP中拆解工单(Disassembly Order)这一特殊生产订单类型的全流程设计与落地要点。内容覆盖拆解业务场景本质(如缺陷产品不可… · 2026/9/23 22:16:01

EMQX ExHook 修复:启用 gRPC over TLS 时校验服务器主机名(verify server host name)
EMQX ExHook 修复:启用 gRPC over TLS 时校验服务器主机名(verify server host name)

后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 本文基于当前仓库 changes/ee/fix-15683.en.md 变更记… · 2026/9/23 22:15:48

LX Music 桌面版:免费开源的多音源播放器,一个搜索框搜遍五个平台
LX Music 桌面版:免费开源的多音源播放器,一个搜索框搜遍五个平台

LX Music 桌面版:免费开源的多音源播放器,一个搜索框搜遍五个平台 【免费下载链接】lx-music-desktop 一个基于 Electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop 听一首歌完整又免费,到底要装… · 2026/9/23 22:15:41

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码