Java Web项目部署指南
适用场景:本地 Windows 开发打包 → 远程 Ubuntu 服务器部署(2025年最佳实践)
适合人群:Java Web初学者、运维新手、需要一站式部署流程的开发者
🚀 部署流程横向流程图
🚦 部署流程总览
- 💻 本地 Windows:项目准备与打包
- ☁️ 服务器 Ubuntu:环境准备(JDK安装)
- ⬆️ 上传 JAR 包:本地 → 服务器
- ☁️ 服务器 Ubuntu:运行 Java 应用
- ☁️ 服务器 Ubuntu:配置 Nginx 反向代理
- ☁️ 服务器 Ubuntu:访问与验证
💻 阶段一:本地 Windows 操作
1.1 检查与准备项目
- 配置检查:确认配置文件(如
application.yml
)适合生产环境。 - 代码构建:确保无编译错误。
1.2 打包可执行 JAR 文件
# Maven
mvn clean package -DskipTests
# Gradle
gradle bootJar
- JAR 包生成路径:
target/
(Maven)或build/libs/
(Gradle)
1.3 上传 JAR 包到服务器
- 推荐工具:XShell、FinalShell、Termius 等带 SFTP 功能的工具
- 操作方法:
- 在工具中新建与服务器的连接,填写服务器IP、端口、用户名、密码(或密钥)。
- 连接成功后,找到左侧(本地)和右侧(服务器)文件管理器。
- 在本地窗口中定位到
target/your-app-name-0.0.1.jar
(或build/libs/
下的JAR包)。 - 拖拽或右键上传到服务器
/opt/myapp/
目录。 - 上传完成后,可在服务器端用
ls /opt/myapp/
验证文件是否存在。
☁️ 阶段二:服务器 Ubuntu 操作
2.1 安装 JDK
sudo apt update
sudo apt install openjdk-17-jdk -y
java -version
javac -version
2.2 创建应用目录
sudo mkdir -p /opt/myapp
# 可选:sudo chown your_ssh_user:your_ssh_user /opt/myapp
2.3 运行 Java 应用
cd /opt/myapp/
nohup java -jar your-app-name-0.0.1.jar > app.log 2>&1 &
日志文件
app.log
会在当前目录生成。
☁️ Systemd 与 nohup 区别与优势说明
nohup
- 用法简单,适合临时或开发环境下让程序在后台持续运行。
- 命令示例:
nohup java -jar your-app-name-0.0.1.jar > app.log 2>&1 &
- 优点:
- 快速、无需额外配置。
- 关闭终端后程序不会退出。
- 缺点:
- 程序崩溃不会自动重启。
- 无法自动开机自启。
- 管理和监控不如 systemd 方便。
Systemd
- 适合生产环境,推荐用于正式部署。
- 通过编写
.service
文件,将 Java 应用注册为系统服务。 - 优点:
- 支持开机自启。
- 程序异常退出可自动重启。
- 统一用
systemctl
管理(启动、停止、重启、查看状态)。 - 日志可统一管理(
journalctl
)。
- 缺点:
- 需要 root 权限和简单配置。
- 示例(/etc/systemd/system/myapp.service):
[Unit] Description=My Java App After=network.target [Service] User=your_ssh_user WorkingDirectory=/opt/myapp ExecStart=/usr/bin/java -jar your-app-name-0.0.1.jar SuccessExitStatus=143 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
- 常用命令:
sudo systemctl daemon-reload sudo systemctl start myapp sudo systemctl enable myapp sudo systemctl status myapp sudo journalctl -u myapp -f
总结:开发/测试可用 nohup,生产环境推荐 systemd,管理更规范、自动化能力更强。
2.4 检查应用状态
- 实时日志:
tail -f app.log
- 检查进程:
pgrep -f "java -jar your-app-name-0.0.1.jar"
- 端口监听:
sudo netstat -tulnp | grep 8080
2.5 配置 Nginx 反向代理
sudo apt install nginx -y
sudo nano /etc/nginx/sites-available/myapp.conf
server {
listen 80;
server_name your_domain_or_server_ip;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
2.6 防火墙配置(如启用)
sudo ufw allow 80/tcp
sudo ufw enable
2.7 访问与验证
- 浏览器访问:
http://your_domain_or_server_ip
🛠️ 常用命令速查
- 查看日志:
tail -f /opt/myapp/app.log
- 停止应用:
kill $(pgrep -f "java -jar your-app-name-0.0.1.jar")
- Nginx 状态:
sudo systemctl status nginx
- 查看 Nginx 错误日志:
tail -n 50 /var/log/nginx/error.log
🐳 补充:Docker 打包与部署说明
1. 编写 Dockerfile
在你的项目根目录下新建一个名为 Dockerfile
的文件,内容如下(以 Java 17 为例):
FROM eclipse-temurin:17-jdk-jammy
WORKDIR /app
COPY target/your-app-name-0.0.1.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
请将
your-app-name-0.0.1.jar
替换为实际的 JAR 文件名。
2. 构建 Docker 镜像
在 Dockerfile 所在目录打开命令行,执行:
docker build -t myapp:latest .
3. 运行 Docker 容器
docker run -d -p 8080:8080 --name myapp myapp:latest
4. 常用 Docker 命令
- 查看容器日志:
docker logs myapp
- 停止容器:
docker stop myapp
- 启动容器:
docker start myapp
- 删除容器:
docker rm myapp
- 查看所有容器:
docker ps -a
如需与 Nginx 配合,Nginx 的 proxy_pass 地址可指向宿主机的 8080 端口。