打包的java的war包或者jar包是如何到服务器上运行起来的
Java 的 WAR 包(Web 应用归档)和 JAR 包(Java 归档)部署到服务器并运行的核心逻辑是:先让服务器具备 Java 运行环境,再通过对应工具(容器 / 命令)解析包内的字节码、依赖和配置,最终启动应用进程。两者的部署流程因包的用途(Web 应用 vs 独立应用)略有差异,下面分步骤详细说明:
- WAR 包:Web 应用专属 → 服务器装 Web 容器(Tomcat)→ 上传 WAR 到 webapps → 启动容器自动运行;
- JAR 包:独立应用 → 服务器仅需 JDK → 上传 JAR →
java -jar命令启动(后台运行 + 开机自启适配生产); - 核心关键:服务器有 JDK、端口放行、权限足够,根据包类型选择对应容器 / 命令即可。
1.前提:服务器必备环境
无论部署 WAR 还是 JAR,服务器都必须先满足基础依赖:
- 安装 JDK/JRE:应用运行依赖 Java 运行环境(JRE),开发 / 调试需 JDK(含编译工具)。
- 步骤:下载对应系统(Linux/Windows)的 JDK(推荐 8/11 版本,兼容性最好)→ 配置环境变量(
JAVA_HOME指向 JDK 安装目录,PATH追加%JAVA_HOME%/bin)→ 验证:java -version输出版本号。
- 步骤:下载对应系统(Linux/Windows)的 JDK(推荐 8/11 版本,兼容性最好)→ 配置环境变量(
- 网络 / 权限准备:
- 开放应用端口(如 Tomcat 默认 8080、Spring Boot JAR 默认 8080),云服务器需配置安全组放行端口;
- 服务器目录权限:部署目录(如
/usr/local/app)需有读写执行权限(避免启动时权限不足)。
2.WAR 包:Web 应用的部署(依赖 Web 容器)
WAR 包是为 Web 应用设计的(含 Servlet、JSP、静态资源等),不能直接运行,必须依赖 Web 容器(本质是解析 WAR 结构、管理 Web 应用生命周期的 Java 程序),主流容器有 Tomcat、Jetty、JBoss 等,以最常用的 Tomcat 为例:
2.1. WAR 包的核心结构(了解即可,无需手动改)
xxx.war
├── WEB-INF/ # 核心目录(容器识别的关键)
│ ├── classes/ # 你的 Java 代码编译后的 .class 文件
│ ├── lib/ # 应用依赖的第三方 JAR 包(如 Spring、MyBatis)
│ └── web.xml # Web 应用配置(Servlet 映射、过滤器等,Spring Boot 可省略)
├── static/ # 静态资源(HTML、CSS、JS、图片,Spring Boot 标准目录)
└── META-INF/ # 包元数据(如 MANIFEST.MF)
2.2. 部署 & 运行步骤(Tomcat 为例)
2.2.1:安装 Tomcat 容器
- 下载 Tomcat(对应 JDK 版本,如 Tomcat 9 适配 JDK 8+)→ 解压到服务器目录(如
/usr/local/tomcat); - 验证 Tomcat 可用性:进入
tomcat/bin目录,执行./startup.sh(Linux)或startup.bat(Windows)→ 浏览器访问http://服务器IP:8080,能看到 Tomcat 默认页面则成功。
2.2.2:上传 WAR 包到 Tomcat
将本地打包好的 WAR 包(如 demo.war),通过工具(Xshell+Xftp、WinSCP、Jenkins 自动化部署)上传到 Tomcat 的 webapps 目录(核心目录,Tomcat 会自动扫描该目录下的 WAR 包)。
2.2.3:启动 Tomcat,自动部署 WAR 包
- 若 Tomcat 已启动:上传 WAR 包后,Tomcat 会自动解压 WAR 包(在 webapps 下生成同名文件夹
demo),并加载应用; - 若未启动:执行
tomcat/bin/startup.sh(Linux)启动 Tomcat,启动时会扫描 webapps 目录,解压并部署所有 WAR 包。
2.2.4:访问应用
应用访问路径格式:http://服务器IP:Tomcat端口/WAR包名(无需加 .war)。示例:WAR 包名 demo.war,Tomcat 端口 8080 → 访问 http://192.168.1.100:8080/demo。
2.2.5补充:其他部署方式(可选)
- 手动解压 WAR 包:将 WAR 包解压到 webapps 目录,Tomcat 会识别解压后的文件夹作为应用;
- 修改 server.xml 配置:在 Tomcat 的
conf/server.xml中添加标签,指定 WAR 包路径(适合自定义访问路径,如根路径/); - 热部署:开启 Tomcat 热部署(修改
conf/server.xml中Context标签的reloadable="true"),修改 WAR 包后无需重启 Tomcat 即可生效(开发环境用,生产环境不推荐,影响性能)。
3.JAR 包:独立应用的部署(内置容器 / 无容器)
JAR 包用途更广:可是普通 Java 程序(无 Web 功能)、Spring Boot 应用(内置 Tomcat/Jetty 容器,无需额外 Web 容器)。核心特点是 可直接运行(前提是 MANIFEST.MF 文件配置了主类)。
3.1. JAR 包的两种类型
- 普通 JAR 包:仅含普通 Java 类(如工具类、控制台程序),无 Web 功能,需通过
java -jar运行; - Spring Boot JAR 包:内置 Web 容器(默认 Tomcat),本质是 “可执行 JAR 包”,包含所有依赖(应用代码、第三方 JAR、内置容器),直接运行即可提供 Web 服务。
3.2. 部署 & 运行步骤(以 Spring Boot JAR 为例,最常用)
3.2.1:确认 JAR 包是 “可执行的”
Spring Boot 打包时,通过 spring-boot-maven-plugin 插件会自动生成可执行 JAR(配置主类、依赖打包方式),MANIFEST.MF 中会包含:
Main-Class: org.springframework.boot.loader.JarLauncher # Spring Boot 启动器
Start-Class: com.demo.DemoApplication # 你的应用主类(含 main 方法)
本地可先验证:java -jar demo.jar,能启动则说明包没问题。
3.2.2:上传 JAR 包到服务器
通过工具(Xftp、WinSCP 等)将 JAR 包(如 demo.jar)上传到服务器指定目录(如 /usr/local/app)。
3.2.3:运行 JAR 包(核心步骤)
在服务器终端进入 JAR 包所在目录,执行以下命令(根据需求选择):
| 运行方式 | 命令示例 | 适用场景 | 优点 / 注意事项 |
|---|---|---|---|
| 前台运行(临时测试) | java -jar demo.jar | 开发 / 测试(快速验证) | 简单直接;关闭终端 / 断开连接,应用立即停止 |
| 后台运行(生产常用) | nohup java -jar demo.jar & | 生产环境(长期运行) | 断开连接后应用继续运行;日志默认输出到 nohup.out |
| 指定端口运行 | nohup java -jar demo.jar --server.port=8090 & | 避免端口冲突 | 覆盖配置文件中的端口(Spring Boot 特性) |
| 指定配置文件运行 | nohup java -jar demo.jar --spring.profiles.active=prod & | 多环境(开发 / 测试 / 生产) | 加载 application-prod.yml 生产环境配置 |
| 限制 JVM 内存运行 | nohup java -Xms512m -Xmx1024m -jar demo.jar & | 避免内存溢出 | -Xms(初始堆内存)、-Xmx(最大堆内存) |
3.2.4:访问应用(Spring Boot 为例)
因内置 Tomcat,直接访问:http://服务器IP:端口(端口默认 8080,或命令中指定的端口)。示例:java -jar demo.jar --server.port=8090 → 访问 http://192.168.1.100:8090。
3.2.5:停止应用(生产必备)
- 方式 1:查找进程 ID(PID)→ 杀死进程:
ps -ef | grep demo.jar # 查找 PID(第二列是 PID) kill -9 12345 # 12345 是 PID,强制停止 - 方式 2:优雅停止(Spring Boot 2.3+ 支持):
# 启动时指定 PID 文件 nohup java -jar demo.jar --spring.pid.file=demo.pid & # 优雅停止(发送 SIGTERM 信号,应用会释放资源后退出) kill -15 $(cat demo.pid)
3.2.6补充:普通 JAR 包(无 Web 功能)的运行
若 JAR 包是普通 Java 程序(如控制台工具),仅需:
- 确保 MANIFEST.MF 配置了主类(如
Main-Class: com.demo.MyMain); - 服务器执行:
java -jar demo.jar(前台运行)或nohup java -jar demo.jar &(后台运行); - 日志查看:前台运行时日志直接输出到终端,后台运行日志在
nohup.out。
4.生产环境优化(可选但推荐)
-
日志管理:
- WAR 包:配置 Tomcat 的日志(
conf/logging.properties),或应用自身日志框架(Logback/Log4j2)输出到指定目录; - JAR 包:通过
logging.file.name指定日志路径(如java -jar demo.jar --logging.file.name=/var/log/demo.log),避免日志堆积在nohup.out。
- WAR 包:配置 Tomcat 的日志(
-
开机自启:避免服务器重启后应用需手动启动,以 Linux 为例(Systemd 服务):
# 1. 创建服务文件 vi /etc/systemd/system/demo.service # 2. 写入以下内容(修改路径和命令) [Unit] Description=Demo Spring Boot App After=network.target [Service] User=root WorkingDirectory=/usr/local/app ExecStart=/usr/local/jdk/bin/java -jar demo.jar --server.port=8080 SuccessExitStatus=143 [Install] WantedBy=multi-user.target # 3. 启用并启动服务 systemctl daemon-reload systemctl enable demo.service # 开机自启 systemctl start demo.service # 启动服务 systemctl status demo.service # 查看状态 -
自动化部署:生产环境推荐用 Jenkins、GitLab CI/CD 等工具,实现 “代码提交 → 自动打包 → 自动上传服务器 → 自动重启应用”,减少手动操作失误。
5.核心区别总结(WAR vs JAR)
| 维度 | WAR 包 | JAR 包(可执行) |
|---|---|---|
| 用途 | Web 应用(Servlet、JSP、Web 接口) | 独立应用(普通 Java 程序、Spring Boot 应用) |
| 运行依赖 | 必须依赖 Web 容器(Tomcat/Jetty) | 无需额外容器(内置容器或直接运行) |
| 部署方式 | 上传到容器的 webapps 目录,容器自动部署 | 上传后通过 java -jar 命令启动 |
| 访问路径 | 容器端口 + 包名(如 8080/demo) | 直接访问容器端口(如 8080) |









