目录
- 准备工作
- 1. 项目打包
- 2. 服务器环境准备
- 3. 文件传输工具
- 核心部署步骤(以 Tomcat 为例)
- 1. 上传项目包
- 2. 部署到 Tomcat
- 3. 启动/重启 Tomcat
- 4. 防火墙与安全组配置
- 5. 访问应用
- 高级部署方式:使用 Docker
- 1. Docker 简介
- 2. 准备 Dockerfile
- 3. 构建镜像
- 4. 运行容器
- 常见问题与解决方案
- 1. 端口被占用
- 2. 访问 404
- 3. 访问 403
- 4. 访问 503 或 500
- 5. 内存溢出
- 生产环境最佳实践
准备工作
在开始部署之前,请确保你已经完成了以下准备工作。

1. 项目打包
Java Web 项目最终需要被打包成一个 WAR (Web Application Archive) 文件或者一个可执行的 JAR 文件。
-
WAR 文件:传统的部署方式,适用于 Tomcat、Jetty 等 Web 容器,如果你的项目是
pom.xml或build.gradle项目,通常使用 Maven 或 Gradle 来构建。- Maven:
mvn clean package - Gradle:
gradle build - 构建成功后,你会在
target(Maven) 或build/libs(Gradle) 目录下找到一个.war文件。
- Maven:
-
JAR 文件:Spring Boot 项目的标准打包方式,内置了 Web 服务器(如 Tomcat),可以直接运行。
- Maven:
mvn clean package - Gradle:
gradle build - 构建成功后,你会在
target或build/libs目录下找到一个可执行的.jar文件。
- Maven:
2. 服务器环境准备
你需要一台云服务器或本地物理机,并安装好必要的软件。

- 操作系统: Linux (如 CentOS, Ubuntu) 是最常见的选择,因为性能和安全性更好。
- Java 运行环境: 你的项目运行在 Java 虚拟机上。
- 安装 OpenJDK 或 Oracle JDK,推荐使用 OpenJDK。
- 检查安装:
java -version和javac -version。
- Web 服务器/应用服务器:
- Tomcat: 最流行、最轻量级的 Web 容器,适合部署 WAR 包。
- Nginx: 作为一个反向代理服务器,负责接收外部请求并转发给后端的 Tomcat 或应用。强烈建议在生产环境中使用 Nginx。
- Apache: 也可以作为反向代理或 Web 服务器。
- 数据库: 如果你的项目需要数据库(如 MySQL, PostgreSQL),确保数据库服务已在服务器上安装并运行,并且你的应用配置文件中的数据库连接信息(IP、端口、用户名、密码)正确。
3. 文件传输工具
你需要一个工具将本地的 .war 或 .jar 文件上传到服务器。
- WinSCP / FileZilla: 图形化 SFTP 客户端,操作简单,适合初学者。
- scp 命令: 命令行工具,适合自动化脚本。
# 语法: scp 本地文件路径 用户名@服务器IP:服务器目标路径 scp /path/to/yourapp.war root@123.45.67.89:/opt/tomcat/webapps/
核心部署步骤(以 Tomcat 为例)
这是最传统的部署方式,假设你已经安装好了 Tomcat。
1. 上传项目包
使用 WinSCP 或 scp 命令,将你打包好的 yourapp.war 文件上传到服务器的 Tomcat 的 webapps 目录下。
- Tomcat 安装目录: 假设为
/opt/tomcat - 上传路径:
/opt/tomcat/webapps/yourapp.war
2. 部署到 Tomcat
Tomcat 非常智能,它会自动检测 webapps 目录下的 .war 文件。

- 自动解压: 当你将
.war文件放入webapps目录后,Tomcat 会自动将其解压成一个同名的文件夹(yourapp),你的应用程序代码和资源文件就在这个文件夹里。 - 自动部署: Tomcat 会自动加载这个新解压的应用,并尝试启动它。
手动部署(可选):
你也可以手动解压,然后修改 conf/server.xml 文件,在 <Host> 标签内添加一个 <Context> 标签来指定应用的路径,但自动部署更简单,推荐使用。
3. 启动/重启 Tomcat
为了确保新部署的应用生效,你需要重启 Tomcat 服务。
-
使用 Tomcat 脚本:
# 进入 Tomcat 的 bin 目录 cd /opt/tomcat/bin # 停止 Tomcat ./shutdown.sh # 启动 Tomcat ./startup.sh
-
使用 systemctl (Tomcat 已设置为系统服务):
# 重启 Tomcat 服务 sudo systemctl restart tomcat
4. 防火墙与安全组配置
如果外部无法访问你的应用,最常见的原因是防火墙或云服务商的安全组策略阻止了请求。
- 检查 Tomcat 端口: 默认是
8080。 - 开放端口:
- 在云服务器控制台(如阿里云、腾讯云): 找到“安全组”规则,添加一条入站规则,端口范围设置为
8080,授权对象为0.0.0/0(允许所有IP访问)。 - 在服务器上 (使用 firewalld):
# 开放 8080 端口 sudo firewall-cmd --permanent --add-port=8080/tcp # 重新加载防火墙 sudo firewall-cmd --reload
- 在云服务器控制台(如阿里云、腾讯云): 找到“安全组”规则,添加一条入站规则,端口范围设置为
5. 访问应用
你可以通过浏览器访问你的应用了。
- URL 格式:
http://<你的服务器IP地址>:<Tomcat端口>/<你的应用名> - 示例:
http://123.45.67.89:8080/yourapp
如果一切顺利,你应该能看到你的应用程序首页。
高级部署方式:使用 Docker
Docker 是目前最主流的部署方式,它能将你的应用和其所有依赖(Java环境、Tomcat等)打包到一个轻量级的容器中,实现“一次构建,处处运行”。
1. Docker 简介
- 镜像: 一个只读的模板,包含了运行应用所需的完整环境(操作系统、JDK、Tomcat、你的应用),相当于一个“快照”。
- 容器: 镜像的运行实例,是隔离的、轻量级的虚拟机。
2. 准备 Dockerfile
在你的项目根目录创建一个名为 Dockerfile 的文件,这个文件用于告诉 Docker 如何构建你的应用镜像。
示例 1: 部署 WAR 包到 Tomcat
假设你的 yourapp.war 已经在项目的 target 目录下。
# 使用官方的 Tomcat 镜像作为基础镜像 FROM tomcat:9-jdk11-openjdk # 删除 Tomcat 默认的 ROOT 应用,避免端口冲突 RUN rm -rf /usr/local/tomcat/webapps/* # 将你的 WAR 包复制到 Tomcat 的 webapps 目录下,并重命名为 ROOT.war # 这样访问根路径 '/' 就能直接访问到你的应用 COPY target/yourapp.war /usr/local/tomcat/webapps/ROOT.war # 暴露 Tomcat 的端口 EXPOSE 8080 # 启动 Tomcat CMD ["catalina.sh", "run"]
示例 2: 部署 Spring Boot JAR
如果你的项目是 Spring Boot,可以使用更简单的 openjdk 镜像。
# 使用一个较轻量的 OpenJDK 镜像 FROM openjdk:11-jre-slim # 设置工作目录 WORKDIR /app # 将可执行的 JAR 文件复制到容器中 COPY target/yourapp.jar /app/yourapp.jar # 暴露应用端口(Spring Boot 默认的 8080) EXPOSE 8080 # 运行你的应用 CMD ["java", "-jar", "yourapp.jar"]
3. 构建镜像
在包含 Dockerfile 的目录下,打开终端,执行以下命令:
# -t 参数用于给镜像打一个标签,格式为 name:tag docker build -t my-java-app:1.0 .
执行完成后,你可以使用 docker images 命令看到新生成的 my-java-app:1.0 镜像。
4. 运行容器
使用 docker run 命令来启动一个基于该镜像的容器。
# -d: 后台运行 # -p: 将主机的端口映射到容器的端口 (主机端口:容器端口) # --name: 给容器起一个名字 docker run -d --name my-app-container -p 8080:8080 my-java-app:1.0
你的应用就在 Docker 容器中运行了,你可以通过 http://<你的服务器IP>:8080 来访问它。
常见问题与解决方案
1. 端口被占用
- 错误:
java.net.BindException: Address already in use - 解决:
- 找到占用端口的进程:
netstat -tulpn | grep :8080 - 杀死进程:
sudo kill -9 <PID>(PID 是上一步查到的进程ID) - 或者修改 Tomcat 的
server.xml文件,将<Connector>的port属性改为其他未被占用的端口。
- 找到占用端口的进程:
2. 访问 404 (Not Found)
- 原因:
- 应用名输入错误。
.war文件没有成功部署到webapps目录,或者没有自动解压。- 应用的
web.xml配置或控制器路径有问题。
- 解决:
- 检查
webapps目录下是否存在你的应用文件夹。 - 查看Tomcat的
logs/catalina.out日志文件,看是否有启动失败的错误信息。
- 检查
3. 访问 403 (Forbidden)
- 原因:
- Tomcat 的
webapps目录或应用目录的权限不正确,Tomcat 运行用户(如tomcat)没有读取文件的权限。
- Tomcat 的
- 解决:
# 修改目录和文件的所有者为 Tomcat 运行用户 (假设是 tomcat) sudo chown -R tomcat:tomcat /opt/tomcat/webapps/yourapp # 递归设置正确的权限 sudo chmod -R 755 /opt/tomcat/webapps/yourapp
4. 访问 503 (Service Unavailable) 或 500 (Internal Server Error)
- 原因: 通常是应用内部错误,如数据库连接失败、代码逻辑错误等。
- 解决:
- 查看日志: 这是最重要的一步!Tomcat 的日志在
logs目录下,主要看catalina.out,Spring Boot 应用则通常在logs目录下有单独的应用日志文件。 - 根据日志中的错误堆栈信息,定位并修复代码问题。
- 查看日志: 这是最重要的一步!Tomcat 的日志在
5. 内存溢出
- 错误:
OutOfMemoryError: Java heap space - 解决:
- 修改 Tomcat 的启动脚本 (
catalina.sh或catalina.bat),增加 JVM 内存参数。 - 在
CATALINA_OPTS环境变量中设置:export CATALINA_OPTS="-Xms512m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"
-Xms: 初始堆大小-Xmx: 最大堆大小 (这是最关键的调优参数)-XX:PermSize/-XX:MaxPermSize: (JDK 8 之前版本) 方法区大小,JDK 8+ 后被Metaspace取代,参数为-XX:MetaspaceSize和-XX:MaxMetaspaceSize。
- 修改 Tomcat 的启动脚本 (
生产环境最佳实践
- 使用 Nginx 作为反向代理: 将所有来自 80 (HTTP) 或 443 (HTTPS) 端口的请求转发到 Tomcat 的 8080 端口,这样可以:
- 使用 Nginx 处理静态资源(图片、CSS、JS),性能更好。
- 配置 SSL/TLS 证书,实现 HTTPS。
- 负载均衡,将请求分发到多个 Tomcat 实例。
- 使用进程管理器: 使用
supervisor或systemd来管理你的 Java 应用或 Tomcat 进程,这样可以在进程意外退出时自动重启,确保服务高可用。 - 配置日志管理: 使用
logrotate等工具来管理日志文件,防止日志文件过大撑爆磁盘。 - 环境分离: 在开发、测试、生产环境中使用不同的配置文件(如数据库连接、API密钥),通常通过
profile来实现。 - 持续集成/持续部署: 使用 Jenkins, GitLab CI, GitHub Actions 等工具,实现代码提交后自动构建、测试和部署,提高效率。
希望这份详细的指南能帮助你成功地将 Java Web 项目部署到服务器!
