Vue项目打包为WAR文件部署Tomcat完整指南

作者:蒙眼过河日期:2026/3/28

Vue项目打包为WAR文件部署Tomcat完整指南

前言

在Vue项目开发完成后,通常我们会将打包后的静态文件部署到Nginx等静态服务器上。但在某些企业环境中,我们需要将Vue项目部署到Tomcat这样的Java应用服务器中。本文将详细介绍如何将Vue项目的打包文件转换为标准的WAR包,以便部署到Tomcat服务器。

为什么需要将Vue打包为WAR包?

  1. 企业规范要求:很多企业使用统一的Tomcat应用服务器集群
  2. 统一管理:便于与后端Java应用统一部署和管理
  3. 历史遗留系统:部分老系统架构需要保持统一部署方式
  4. 路由支持:解决Vue History模式下刷新404的问题

实现原理

Vue项目打包后会生成静态文件(HTML、CSS、JS等),而Tomcat要求部署的应用需要符合Servlet规范。通过添加WEB-INF/web.xml配置文件并打包为WAR格式,就可以让Tomcat正常识别和运行Vue应用。

详细步骤

第一步:项目打包

根据环境选择对应的打包命令:

1# 测试环境打包
2npm run test
3
4# 生产环境打包
5npm run build
6

执行成功后,会在项目根目录下生成dist文件夹,里面包含了所有静态资源文件。

第二步:创建WEB-INF目录

dist目录下创建WEB-INF文件夹:

1mkdir dist/WEB-INF
2

这个目录是Java Web应用的标准目录结构,用于存放配置文件。

第三步:配置web.xml文件

WEB-INF目录下创建web.xml文件,内容如下:

1<?xml version="1.0"?>
2<web-app>
3    <error-page>
4        <error-code>404</error-code>
5        <location>/index.html</location>
6    </error-page>
7</web-app>
8

配置说明

  • 这个配置将所有的404错误重定向到index.html
  • 解决了Vue Router的History模式下,直接访问子路由404的问题
  • 确保前端路由能正常工作

第四步:打包为WAR文件

进入dist目录,使用jar命令打包:

1cd dist
2jar -cvf xxxx.war *
3

参数说明:

  • -c:创建新的归档文件
  • -v:在标准输出中生成详细输出
  • -f:指定归档文件名
  • *:包含当前目录下的所有文件

自动化打包脚本

为了提高打包效率,我们编写了自动化脚本build.bat

1@echo off
2chcp 65001 >nul
3echo ========================================
4echo Vue项目WAR打包工具
5echo ========================================
6
7REM 步骤1: 执行项目打包
8echo [步骤1] 正在执行打包命令...
9set /p env="请选择环境 (test/prod): "
10
11if "%env%"=="test" (
12    echo 执行测试环境打包...
13    call npm run test
14) else if "%env%"=="prod" (
15    echo 执行生产环境打包...
16    call npm run build
17) else (
18    echo 输入错误,请重新运行脚本并输入 test  prod
19    pause
20    exit /b 1
21)
22
23REM 检查打包是否成功
24if %errorlevel% neq 0 (
25    echo 打包失败,请检查错误信息
26    pause
27    exit /b 1
28)
29echo 打包完成
30echo.
31
32REM 步骤2: 创建WEB-INF目录
33echo [步骤2] 创建WEB-INF目录...
34if not exist "dist\WEB-INF" (
35    mkdir dist\WEB-INF
36    echo WEB-INF目录创建成功
37) else (
38    echo WEB-INF目录已存在
39)
40echo.
41
42REM 步骤3: 创建web.xml文件
43echo [步骤3] 创建web.xml文件...
44(
45echo ^<?xml version="1.0"?^>
46echo ^<web-app^>
47echo     ^<error-page^>
48echo         ^<error-code^>404^</error-code^>
49echo         ^<location^>/index.html^</location^>
50echo     ^</error-page^>
51echo ^</web-app^>
52) > dist\WEB-INF\web.xml
53echo web.xml文件创建成功
54echo.
55
56REM 步骤4: 打包为WAR文件
57echo [步骤4] 打包为WAR文件...
58cd dist
59set war_name=xxxx.war
60
61REM 如果war文件已存在,先删除
62if exist "%war_name%" (
63    del "%war_name%"
64    echo 已删除旧的%war_name%文件
65)
66
67REM 执行打包命令
68jar -cvf %war_name% *
69if %errorlevel% equ 0 (
70    echo WAR文件打包成功: dist\%war_name%
71) else (
72    echo WAR文件打包失败
73    cd ..
74    pause
75    exit /b 1
76)
77
78cd ..
79echo.
80echo ========================================
81echo 打包完成!
82echo WAR文件位置: dist\xxxx.war
83echo ========================================
84pause
85

脚本使用说明

  1. 将脚本保存为build.bat,放在项目根目录
  2. 双击运行,根据提示选择环境:
    • 输入test:测试环境打包
    • 输入prod:生产环境打包
  3. 脚本会自动完成所有步骤,生成WAR文件

Vue项目配置注意事项

1. publicPath配置

vue.config.js中需要正确配置publicPath

1module.exports = {
2  publicPath: process.env.NODE_ENV === 'production'
3    ? '/your-app-name/'
4    : '/',
5  // 其他配置...
6}
7

2. Router配置

如果部署在Tomcat的子路径下,需要在路由中配置base:

1const router = new VueRouter({
2  mode: 'history',
3  base: process.env.BASE_URL,
4  routes
5})
6

3. 环境变量配置

在项目根目录创建环境变量文件:

1# .env.test
2VUE_APP_API_URL=http://test-api.example.com
3
4# .env.production
5VUE_APP_API_URL=http://api.example.com
6

部署到Tomcat

1. 部署方式

将生成的xxxx.war文件复制到Tomcat的webapps目录下,Tomcat会自动解压部署。

2. 访问应用

部署成功后,通过以下地址访问:

1http://localhost:8080/xxxx/
2

3. 常见问题

问题1:页面刷新404

  • 原因:没有配置404重定向
  • 解决:确保web.xml中已正确配置error-page

问题2:静态资源404

  • 原因:publicPath配置不正确
  • 解决:根据部署路径调整vue.config.js中的publicPath

问题3:中文乱码

  • 原因:编码格式不一致
  • 解决:使用UTF-8编码保存文件,脚本中添加chcp 65001

优化建议

1. 添加版本控制

可以在WAR包文件名中加入版本号:

1set version=1.0.0
2set war_name=xxxx_%version%.war
3

2. 添加构建时间

在打包时记录构建时间:

1echo 构建时间:%date% %time% > dist/build-info.txt
2

3. 压缩优化

使用压缩工具进一步优化WAR包大小:

1jar -cvfM0 %war_name% *
2

4. 自动化CI/CD

将打包脚本集成到CI/CD流程中:

1# GitLab CI示例
2build:
3  stage: build
4  script:
5    - npm install
6    - npm run build
7    - ./build.bat
8  artifacts:
9    paths:
10      - dist/*.war
11

总结

通过以上步骤,我们成功将Vue项目打包为WAR文件,实现了在Tomcat上的部署。这种方式既保留了Vue开发的便利性,又满足了企业级应用部署的需求。关键点在于:

  1. 正确配置web.xml处理前端路由
  2. 使用自动化脚本提高打包效率
  3. 注意publicPath和路由base的配置
  4. 处理好编码和路径问题

掌握这套方法,就能灵活地在各种Java Web服务器上部署Vue项目了。

参考资料


Vue项目打包为WAR文件部署Tomcat完整指南》 是转载文章,点击查看原文


相关推荐


Django 基础入门教程(第四篇):Form组件、Auth认证、Cookie/Session与中间件
冉成未来2026/3/20

在前三篇中,我们完成了 Django 的环境搭建、模型设计、视图模板、Admin 后台以及 ORM 高级查询。本篇将带你深入 Django 的用户交互与安全机制:Form 组件、Auth 认证系统、Cookie/Session 和中间件。学完本篇,你将能够处理复杂的表单验证、实现用户注册登录、管理用户会话,并理解 Django 的请求/响应处理流程。 第一部分:Django Form 组件 1.1 为什么需要 Form 组件? 在 Web 开发中,处理表单是常见且复杂的任务。你需要:


AI时代的数据对比:DBA还需要盯着屏幕看差异吗?
NineData2026/3/12

当 AI 已经能写 SQL、辅助诊断、生成代码时,很多企业的数据对比却还停留在相对原始的阶段:任务跑完,DBA 需要面对动辄上百张表的差异报告,逐行核对的工作量极大。 这种场景在迁移、同步、数据备份演练里并不少见,到了国产化迁移场景下更是被进一步放大。数据库从 Oracle 迁到达梦、从 MySQL 迁到人大金仓,变化的不只是运行环境,更是数据库内核、数据类型、字符集规则和兼容语义。DBA 担心的往往不是任务失败,而是任务看起来已经完成,业务流量切换之后才发现数据并不一致。 AI 时代的数据对


ubuntu应用深度守护
字节逆旅2026/3/4

二、 定位分析:抽丝剥茧 1. 系统日志中的“启动死循环” 输入sudo grep "linux-myApp" /var/log/syslog调取 syslog 发现,系统曾多次尝试自动拉起应用,但均告失败。 报错核心:Exec binary ... does not exist: No such file or directory。 结论:系统预设的自动启动路径与实际安装路径不匹配,导致应用在服务器重启后无法“回家”。 2. 定位原因 上面的日志内容意味着我的应用可能已经被卸载、被移动了位


【C++】整数类型(Integer Types)避雷指南与正确使用姿势
PAK向日葵2026/2/24

背景 C++继承自C语言。作为一门以零开销抽象为主要特征的底层语言,不同于Python或JavaScript等高抽象层次的语言,C++拥有一套较为完整、但又包含有一定历史包袱的内建整数类型。 在实际开发中,如果对C++内建整数类型的机制不熟悉,或者不遵循一定的使用规范,则非常容易引入难以排查和调试的Bug。因此学习了解C++中内建整数类型的特性,以及一套行之有效的使用规范,是非常有必要的。 内建整数类型的坑 or 历史包袱 C++ 标准没有规定具体位数 虽然在实际实践中,我们知道在x64平台,对


百度 APP 正式接入 OpenClaw,所有人限时免费!
苍何2026/2/15

这是苍何的第 495 篇原创! 大家好,我是苍何。 最近被 OpenClaw 刷屏了吧? 3 周时间 GitHub Star 干到 19 万,比当年 DeepSeek 还猛。 我也发了好几篇文章了,然后还开源了个知识库,你别说,还挺多人用的。 基本上接入 QQ、微信、飞书、discord 等都写的比较全了。 但是说实话,OpenClaw 的部署使用过程并不算丝滑。 买服务器、配环境、装依赖,光是部署就需要折腾大半天。 好不容易跑起来了,还得通过 Telegram 来发指令。 就,怎么说呢,能用


主流模型对比-02
一诺滚雪球2026/2/6

前言 GPT-4、Claude、Llama、Qwen、DeepSeek... 面对层出不穷的大语言模型,你是否也曾感到迷茫? 选贵的 GPT-4,还是用免费的开源模型? 中文场景应该用什么模型? 本地部署和云端 API 各有什么优劣? 性价比最高的选择是什么? 选对模型,不仅能节省成本,还能获得更好的效果。今天我们来聊聊如何做出明智的选择。 1. 什么是模型选型 1.1 闭源模型 vs 开源模型 特点闭源模型开


langchain学习笔记(二):工具的调用
Shawn_Shawn2026/1/29

Tool Calling 定义简单tool 创建工具最简单的方法是使用 @tool 装饰器。 @tool(description="Returns the current time in yyyy-MM-dd HH:mm:ss format.") def get_current_time(*args, **kwargs) -> str: """ 获取当前系统时间。 格式为:yyyy-MM-dd HH:mm:ss """ now = datetime.dat


2025.12.17华为软开
ゞ 正在缓冲99%…2026/1/19

细胞增殖 import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); long n = scanner.nextLong();//n个观测值


hive问题
心止水j2026/1/11

一、基础概念 问题:简述 Hive 的定义及核心作用?答案:Hive 是基于 Hadoop 的数据仓库工具,支持类 SQL(HQL)查询分析;核心作用是让非开发人员通过 SQL 分析 Hadoop 上的海量数据。 问题:Hive 的元数据默认存储在哪里?生产环境中为什么要替换为 MySQL?答案:默认存 Derby;生产换 MySQL 因 Derby 仅单用户、不支持并发,MySQL 支持多用户并发、数据持久化且易维护。 问题:Hive 支持哪些执行引擎?它们的区别是什么?答案


GDAL 实现自定义数据坐标系
GIS之路2026/1/3

^ 关注我,带你一起学GIS ^ 前言 ❝ 在GIS开发中,经常需要进行数据的转换处理,特别是Shapefile数据的投影转换更是重中之重,如何高效、准确的将源数据坐标系转换到目标坐标系是我们需要研究解决的问题。 在之前的文章中讲了如何使用GDAL或者ogr2ogr工具将txt以及csv文本数据转换为Shp格式,本篇教程在之前一系列文章的基础上讲解如何使用GDAL实现自定义数据坐标系。 GDAL 简介 GDAL 下载安装 GDAL 开发起步 GDAL 实现 GIS 数据读取转换(全) 如

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客