Java 项目打包与部署完全指南JAR vs WAR从构建到运行1. 引言项目开发完成后如何将其部署到服务器上让用户能够访问对于 Java 开发者而言打包和部署是上线前最后、也是最关键的一步。Java 项目通常打包成两种格式JAR和WAR。选择哪种包以及如何部署取决于项目类型、运行环境和团队习惯。本文将从零开始带你全面了解✅ 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.xmlMaven或build.gradleGradle中的打包配置判断。Maven 示例!-- 打包为 JAR --packagingjar/packaging!-- 打包为 WAR --packagingwar/packagingGradle 示例// 打包为 JARapply plugin:java// 打包为 WARapply plugin:war4. 打包命令详解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:repackage4.2 Gradle 项目命令作用gradle clean删除 build 目录gradle build编译、测试、打包gradle build -x test跳过测试打包打包后的文件位置Maventarget/xxx.jar或target/xxx.warGradlebuild/libs/xxx.jar或build/libs/xxx.war5. 部署 JAR 包5.1 基本运行命令java-jarapp.jar该命令会在前台运行按Ctrl C会终止进程关闭终端也会导致进程退出。5.2 后台运行Linux/Unixnohupjava-jarapp.jarapp.log21nohup忽略挂断信号关闭终端后进程继续运行 app.log标准输出重定向到文件21将错误输出也重定向到同一个文件后台运行查看进程ps -ef | grep app.jar停止进程kill -9 PID5.3 指定参数5.3.1 系统属性-Djava-Dserver.port8081-Dspring.profiles.activeprod-jarapp.jar5.3.2 命令行参数–Spring Boot 支持使用--直接覆盖配置java-jarapp.jar--server.port8081--spring.datasource.urljdbc:mysql://localhost:3306/mydb5.3.3 外部配置文件java-jarapp.jar--spring.config.location/path/to/application.yml5.4 常见 JVM 调优参数java-Xms512m-Xmx2g-XX:UseG1GC-jarapp.jar-Xms初始堆内存-Xmx最大堆内存-XX:UseG1GC使用 G1 垃圾回收器5.5 使用 systemd 管理 JAR生产推荐创建服务文件/etc/systemd/system/myapp.service[Unit] DescriptionMy Spring Boot Application Afternetwork.target [Service] Userappuser ExecStart/usr/bin/java -jar /opt/myapp/app.jar SuccessExitStatus143 Restartalways [Install] WantedBymulti-user.target启用并启动systemctl daemon-reload systemctlenablemyapp systemctl start myapp systemctl status myapp6. 部署 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.sh6.2 部署优化配置虚拟路径修改conf/server.xml添加Context元素。热部署将 WAR 放到webapps后Tomcat 会自动重新部署但生产环境不建议。内存配置修改bin/catalina.sh或setenv.shexportJAVA_OPTS-Xms512m -Xmx2g6.3 其他容器Jetty将 WAR 放到webapps目录运行java -jar start.jarWebLogic / WebSphere通过管理控制台部署7. 部署流程全景图Spring Boot微服务/工具类传统 Web 项目前台后台服务化开发完成项目类型打包为 JAR打包为 WAR上传到服务器运行方式java -jar app.jarnohup java -jar app.jar 配置 systemd / supervisor验证应用接口安装 Tomcat/Jetty将 WAR 放入 webapps启动容器通过浏览器访问8. 常用命令速查表操作命令Maven 打包跳过测试mvn clean package -DskipTestsGradle 打包gradle clean build运行 JAR前台java -jar app.jar运行 JAR后台nohup java -jar app.jar /dev/null 21 指定端口运行 JARjava -jar app.jar --server.port8081查看 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 80809. 常见问题与解决方案9.1 JAR 包运行提示 “no main manifest attribute”原因打包时没有指定主类Main-Class。解决Spring Boot确保spring-boot-maven-plugin已配置。plugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin9.2 WAR 包部署后访问 404检查webapps下是否生成了同名目录。确认访问路径http://ip:port/项目名/。查看logs/catalina.out是否有部署错误。9.3 端口冲突# 查看端口占用netstat-anp|grep8080# 修改运行端口java-jarapp.jar--server.port80819.4 内存溢出OOM增加堆内存限制java-Xms1g-Xmx2g-jarapp.jar9.5 后台运行的 JAR 如何查看实时日志tail-fapp.log# 如果重定向到了文件# 或使用 journalctlsystemd 管理时journalctl-umyapp-f10. 总结与最佳实践场景推荐方式微服务、云原生应用JAR systemd或 Docker传统单体 Web 应用与运维统一管理WAR Tomcat开发调试java -jar前台运行生产环境systemd / supervisor 管理 JAR或使用容器编排需要动态调整参数使用--spring.config.location外部化配置部署检查清单✅ 打包前运行所有测试✅ 使用-DskipTests加速构建仅当测试已覆盖✅ 配置 JVM 堆大小和垃圾回收器✅ 将配置文件外置避免重新打包✅ 配置日志轮转如 logrotate✅ 设置健康检查端点配合监控系统下期预告Docker 化部署 Spring Boot 应用从 Dockerfile 到 Kubernetes
Java 项目打包与部署完全指南:JAR vs WAR,从构建到运行
发布时间:2026/5/23 10:06:30
Java 项目打包与部署完全指南JAR vs WAR从构建到运行1. 引言项目开发完成后如何将其部署到服务器上让用户能够访问对于 Java 开发者而言打包和部署是上线前最后、也是最关键的一步。Java 项目通常打包成两种格式JAR和WAR。选择哪种包以及如何部署取决于项目类型、运行环境和团队习惯。本文将从零开始带你全面了解✅ 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.xmlMaven或build.gradleGradle中的打包配置判断。Maven 示例!-- 打包为 JAR --packagingjar/packaging!-- 打包为 WAR --packagingwar/packagingGradle 示例// 打包为 JARapply plugin:java// 打包为 WARapply plugin:war4. 打包命令详解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:repackage4.2 Gradle 项目命令作用gradle clean删除 build 目录gradle build编译、测试、打包gradle build -x test跳过测试打包打包后的文件位置Maventarget/xxx.jar或target/xxx.warGradlebuild/libs/xxx.jar或build/libs/xxx.war5. 部署 JAR 包5.1 基本运行命令java-jarapp.jar该命令会在前台运行按Ctrl C会终止进程关闭终端也会导致进程退出。5.2 后台运行Linux/Unixnohupjava-jarapp.jarapp.log21nohup忽略挂断信号关闭终端后进程继续运行 app.log标准输出重定向到文件21将错误输出也重定向到同一个文件后台运行查看进程ps -ef | grep app.jar停止进程kill -9 PID5.3 指定参数5.3.1 系统属性-Djava-Dserver.port8081-Dspring.profiles.activeprod-jarapp.jar5.3.2 命令行参数–Spring Boot 支持使用--直接覆盖配置java-jarapp.jar--server.port8081--spring.datasource.urljdbc:mysql://localhost:3306/mydb5.3.3 外部配置文件java-jarapp.jar--spring.config.location/path/to/application.yml5.4 常见 JVM 调优参数java-Xms512m-Xmx2g-XX:UseG1GC-jarapp.jar-Xms初始堆内存-Xmx最大堆内存-XX:UseG1GC使用 G1 垃圾回收器5.5 使用 systemd 管理 JAR生产推荐创建服务文件/etc/systemd/system/myapp.service[Unit] DescriptionMy Spring Boot Application Afternetwork.target [Service] Userappuser ExecStart/usr/bin/java -jar /opt/myapp/app.jar SuccessExitStatus143 Restartalways [Install] WantedBymulti-user.target启用并启动systemctl daemon-reload systemctlenablemyapp systemctl start myapp systemctl status myapp6. 部署 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.sh6.2 部署优化配置虚拟路径修改conf/server.xml添加Context元素。热部署将 WAR 放到webapps后Tomcat 会自动重新部署但生产环境不建议。内存配置修改bin/catalina.sh或setenv.shexportJAVA_OPTS-Xms512m -Xmx2g6.3 其他容器Jetty将 WAR 放到webapps目录运行java -jar start.jarWebLogic / WebSphere通过管理控制台部署7. 部署流程全景图Spring Boot微服务/工具类传统 Web 项目前台后台服务化开发完成项目类型打包为 JAR打包为 WAR上传到服务器运行方式java -jar app.jarnohup java -jar app.jar 配置 systemd / supervisor验证应用接口安装 Tomcat/Jetty将 WAR 放入 webapps启动容器通过浏览器访问8. 常用命令速查表操作命令Maven 打包跳过测试mvn clean package -DskipTestsGradle 打包gradle clean build运行 JAR前台java -jar app.jar运行 JAR后台nohup java -jar app.jar /dev/null 21 指定端口运行 JARjava -jar app.jar --server.port8081查看 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 80809. 常见问题与解决方案9.1 JAR 包运行提示 “no main manifest attribute”原因打包时没有指定主类Main-Class。解决Spring Boot确保spring-boot-maven-plugin已配置。plugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin9.2 WAR 包部署后访问 404检查webapps下是否生成了同名目录。确认访问路径http://ip:port/项目名/。查看logs/catalina.out是否有部署错误。9.3 端口冲突# 查看端口占用netstat-anp|grep8080# 修改运行端口java-jarapp.jar--server.port80819.4 内存溢出OOM增加堆内存限制java-Xms1g-Xmx2g-jarapp.jar9.5 后台运行的 JAR 如何查看实时日志tail-fapp.log# 如果重定向到了文件# 或使用 journalctlsystemd 管理时journalctl-umyapp-f10. 总结与最佳实践场景推荐方式微服务、云原生应用JAR systemd或 Docker传统单体 Web 应用与运维统一管理WAR Tomcat开发调试java -jar前台运行生产环境systemd / supervisor 管理 JAR或使用容器编排需要动态调整参数使用--spring.config.location外部化配置部署检查清单✅ 打包前运行所有测试✅ 使用-DskipTests加速构建仅当测试已覆盖✅ 配置 JVM 堆大小和垃圾回收器✅ 将配置文件外置避免重新打包✅ 配置日志轮转如 logrotate✅ 设置健康检查端点配合监控系统下期预告Docker 化部署 Spring Boot 应用从 Dockerfile 到 Kubernetes