当前位置: 首页 > news >正文

Java 项目打包与部署完全指南:JAR vs WAR,从构建到运行

Java 项目打包与部署完全指南:JAR vs WAR,从构建到运行

1. 引言

项目开发完成后,如何将其部署到服务器上,让用户能够访问?对于 Java 开发者而言,打包部署是上线前最后、也是最关键的一步。Java 项目通常打包成两种格式:JARWAR。选择哪种包,以及如何部署,取决于项目类型、运行环境和团队习惯。

本文将从零开始,带你全面了解:

  • ✅ JAR 包与 WAR 包的本质区别和适用场景
  • ✅ 使用 Maven/Gradle 打包的具体命令
  • ✅ 部署 JAR 包的多种方式(前台、后台、参数配置)
  • ✅ 部署 WAR 包到 Tomcat 的详细步骤
  • ✅ 部署流程全景图与常见问题排查

无论你是刚入门的开发者,还是需要负责上线任务的工程师,都能从中获得实用的指导。


2. JAR vs WAR:核心区别

WAR包

传统 Web 项目
需要外置容器

不含 Web 容器

需部署到 Tomcat/Jetty 等

JAR包

普通 Java 项目
或 Spring Boot

包含内嵌 Web 容器
Tomcat/Jetty/Undertow

直接 java -jar 运行

维度JAR 包WAR 包
全称Java ARchiveWeb Application ARchive
包含内容类文件、依赖库、配置文件(可能含内嵌容器)类文件、依赖库、配置文件、Web 资源(JSP/HTML)
运行方式java -jar xxx.jar(独立进程)放置在外部 Web 容器的webapps目录下,启动容器
适用场景Spring Boot / Spring Cloud 微服务、命令行工具传统单体 Web 应用、需要部署在统一管理的 Tomcat 集群
容器依赖无需安装额外容器必须预先安装 Tomcat/Jetty/JBoss 等
启动速度快(直接启动)相对慢(需启动容器)
资源占用每个 JAR 独立占用内存多个 WAR 可共享同一个容器进程

3. 打包前的准备:项目类型判断

在打包之前,先明确你的项目是什么类型:

  • 如果是Spring Boot 项目(默认打包为 JAR,但也可配置为 WAR)
  • 如果是传统 Servlet/JSP 项目(通常打包为 WAR)
  • 如果是纯工具类/批处理应用(一定是 JAR)

可以通过pom.xml(Maven)或build.gradle(Gradle)中的打包配置判断。

Maven 示例

<!-- 打包为 JAR --><packaging>jar</packaging><!-- 打包为 WAR --><packaging>war</packaging>

Gradle 示例

// 打包为 JARapply plugin:'java'// 打包为 WARapply plugin:'war'

4. 打包命令详解

4.1 Maven 项目

命令作用
mvn clean删除 target 目录,清理旧文件
mvn compile编译源代码
mvn test运行测试用例
mvn package打包(生成 JAR/WAR 到 target 目录)
mvn install打包并安装到本地 Maven 仓库
mvn deploy打包并部署到远程仓库(如 Nexus)

常用组合

# 跳过测试,快速打包mvn clean package-DskipTests# 生成可执行 JAR(需 Spring Boot Maven 插件)mvn clean package spring-boot:repackage

4.2 Gradle 项目

命令作用
gradle clean删除 build 目录
gradle build编译、测试、打包
gradle build -x test跳过测试打包

打包后的文件位置:

  • Maven:target/xxx.jartarget/xxx.war
  • Gradle:build/libs/xxx.jarbuild/libs/xxx.war

5. 部署 JAR 包

5.1 基本运行命令

java-jarapp.jar

该命令会在前台运行,按Ctrl + C会终止进程,关闭终端也会导致进程退出。

5.2 后台运行(Linux/Unix)

nohupjava-jarapp.jar>app.log2>&1&
  • nohup:忽略挂断信号,关闭终端后进程继续运行
  • > app.log:标准输出重定向到文件
  • 2>&1:将错误输出也重定向到同一个文件
  • &:后台运行

查看进程:ps -ef | grep app.jar
停止进程:kill -9 <PID>

5.3 指定参数

5.3.1 系统属性(-D)
java-Dserver.port=8081-Dspring.profiles.active=prod-jarapp.jar
5.3.2 命令行参数(–)

Spring Boot 支持使用--直接覆盖配置:

java-jarapp.jar--server.port=8081--spring.datasource.url=jdbc:mysql://localhost:3306/mydb
5.3.3 外部配置文件
java-jarapp.jar--spring.config.location=/path/to/application.yml

5.4 常见 JVM 调优参数

java-Xms512m-Xmx2g-XX:+UseG1GC-jarapp.jar
  • -Xms:初始堆内存
  • -Xmx:最大堆内存
  • -XX:+UseG1GC:使用 G1 垃圾回收器

5.5 使用 systemd 管理 JAR(生产推荐)

创建服务文件/etc/systemd/system/myapp.service

[Unit] Description=My Spring Boot Application After=network.target [Service] User=appuser ExecStart=/usr/bin/java -jar /opt/myapp/app.jar SuccessExitStatus=143 Restart=always [Install] WantedBy=multi-user.target

启用并启动:

systemctl daemon-reload systemctlenablemyapp systemctl start myapp systemctl status myapp

6. 部署 WAR 包

6.1 部署到 Tomcat

步骤 1:安装 Tomcat
# 下载并解压wgethttps://dlcdn.apache.org/tomcat/tomcat-9/v9.0.89/bin/apache-tomcat-9.0.89.tar.gztar-xzfapache-tomcat-9.0.89.tar.gzcdapache-tomcat-9.0.89
步骤 2:放置 WAR 包

将生成的.war文件复制到 Tomcat 的webapps目录下:

cpmyapp.war /path/to/tomcat/webapps/

Tomcat 会自动解压并部署(默认会监听8080端口)。访问地址:http://localhost:8080/myapp/

步骤 3:启动 Tomcat
./bin/startup.sh# Linux# 或./bin/startup.bat# Windows
步骤 4:查看日志
tail-flogs/catalina.out
步骤 5:停止 Tomcat
./bin/shutdown.sh

6.2 部署优化

  • 配置虚拟路径:修改conf/server.xml,添加<Context>元素。
  • 热部署:将 WAR 放到webapps后,Tomcat 会自动重新部署(但生产环境不建议)。
  • 内存配置:修改bin/catalina.sh(或setenv.sh):
    exportJAVA_OPTS="-Xms512m -Xmx2g"

6.3 其他容器

  • Jetty:将 WAR 放到webapps目录,运行java -jar start.jar
  • WebLogic / WebSphere:通过管理控制台部署

7. 部署流程全景图

Spring Boot
微服务/工具类

传统 Web 项目

前台

后台

服务化

开发完成

项目类型

打包为 JAR

打包为 WAR

上传到服务器

运行方式

java -jar app.jar

nohup java -jar app.jar &

配置 systemd / supervisor

验证应用接口

安装 Tomcat/Jetty

将 WAR 放入 webapps

启动容器

通过浏览器访问


8. 常用命令速查表

操作命令
Maven 打包(跳过测试)mvn clean package -DskipTests
Gradle 打包gradle clean build
运行 JAR(前台)java -jar app.jar
运行 JAR(后台)nohup java -jar app.jar > /dev/null 2>&1 &
指定端口运行 JARjava -jar app.jar --server.port=8081
查看 JAR 进程ps -ef | grep java
停止 JAR 进程kill -9 <PID>
启动 Tomcat./bin/startup.sh
停止 Tomcat./bin/shutdown.sh
查看 Tomcat 日志tail -f logs/catalina.out
查看端口占用netstat -tlnp | grep 8080

9. 常见问题与解决方案

9.1 JAR 包运行提示 “no main manifest attribute”

原因:打包时没有指定主类(Main-Class)。
解决(Spring Boot):确保spring-boot-maven-plugin已配置。

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin>

9.2 WAR 包部署后访问 404

  • 检查webapps下是否生成了同名目录。
  • 确认访问路径:http://ip:port/项目名/
  • 查看logs/catalina.out是否有部署错误。

9.3 端口冲突

# 查看端口占用netstat-anp|grep8080# 修改运行端口java-jarapp.jar--server.port=8081

9.4 内存溢出(OOM)

增加堆内存限制:

java-Xms1g-Xmx2g-jarapp.jar

9.5 后台运行的 JAR 如何查看实时日志?

tail-fapp.log# 如果重定向到了文件# 或使用 journalctl(systemd 管理时)journalctl-umyapp-f

10. 总结与最佳实践

场景推荐方式
微服务、云原生应用JAR + systemd(或 Docker)
传统单体 Web 应用,与运维统一管理WAR + Tomcat
开发调试java -jar前台运行
生产环境systemd / supervisor 管理 JAR,或使用容器编排
需要动态调整参数使用--spring.config.location外部化配置

部署检查清单

  • ✅ 打包前运行所有测试
  • ✅ 使用-DskipTests加速构建(仅当测试已覆盖)
  • ✅ 配置 JVM 堆大小和垃圾回收器
  • ✅ 将配置文件外置,避免重新打包
  • ✅ 配置日志轮转(如 logrotate)
  • ✅ 设置健康检查端点,配合监控系统

下期预告:Docker 化部署 Spring Boot 应用:从 Dockerfile 到 Kubernetes

http://www.cnnetsun.cn/news/2524303.html

相关文章:

  • 革命性Excel MCP Server:无需安装Excel的终极数据处理解决方案
  • Cortex-R52调试ROM地址配置与ARMv8调试架构解析
  • 口碑好的冬虫夏草企业
  • unplugin-dts多构建工具支持:Vite、Rollup、Webpack、Rspack配置指南
  • RefineDet与SSD、YOLO对比:2023年单阶段目标检测算法横向测评 [特殊字符]
  • B站缓存视频合并神器:3分钟搞定分段视频,畅享离线观看体验
  • Android Studio中文界面完整指南:3步实现母语开发环境
  • NNVM图优化技术详解:10个提升模型性能的关键Pass
  • 别再瞎加索引了!这个Explain对比让我少走三年弯路
  • 如何在5分钟内用AI完成复杂图像分层:layerdivider智能图层分离终极指南
  • 如何突破数字枷锁:QMCDecode终极解决方案实现音频格式自由
  • Vue Antd Admin企业级后台架构深度解析:如何构建现代化中台管理系统解决方案
  • 抖音下载神器:免费批量下载无水印视频的终极指南
  • Poppins几何字体:如何让拉丁文与天城体在同一个视觉世界里和谐共舞?
  • 如何在5分钟内掌握Translumo:Windows平台最强实时屏幕翻译工具
  • 设计职场重复工作自动化梳理程序,统计高频机械工作,给出可简化替代创新方案。
  • HarmonyOS 6学习:水平仪气泡移动方向错误的完整分析与修复方案
  • 一篇文章告诉你什么是索引?
  • Windows热键冲突终极解决方案:Hotkey Detective快速定位“热键小偷“的完整指南
  • 如何永久保存微信聊天记录:WeChatMsg完全解决方案指南
  • OBS多平台推流插件终极指南:3分钟实现一键同步直播到多个平台
  • Faster-Whisper-GUI简繁体字幕转换机制深度解析与优化策略
  • 终极Navicat密码恢复指南:3分钟快速找回遗忘的数据库连接密码
  • 校园考勤数据实战:ETL 全流程 + BI 可视化从 0 到 1 搭建
  • 5分钟掌握ncmdumpGUI:轻松转换网易云音乐NCM文件为MP3
  • 我开源了一个AI智囊团:200+专家实时群聊,自动拆解需求组建团队,这可能是目前最实用的AI协作平台
  • 零基础转行工业AI视觉全攻略|从入门学习、项目积累、求职就业到副业接单完整路径
  • 抖音下载神器:三步速成法,轻松批量下载无水印视频
  • 如何高效管理Windows右键菜单:专业工具完全指南
  • 内外网隔开