核心思想:分离环境、应用和配置
一个专业且易于维护的部署,应该将以下三者清晰地分开:

- Java 环境 (JDK/JRE): 系统级的运行时环境。
- 应用本身: 你的 Java 打包后的文件(如 JAR, WAR)。
- 配置文件: 数据库连接、日志级别、应用参数等。
第一步:准备工作
在部署应用之前,确保你的 Linux 服务器已经准备就绪。
1. 获取服务器权限
你需要一台 Linux 服务器,并通过 SSH 登录。
ssh username@your_server_ip
2. 更新系统
这是一个好习惯,可以确保系统软件包是最新的。
# 对于 Debian/Ubuntu 系统 sudo apt update && sudo apt upgrade -y # 对于 CentOS/RHEL/Fedora 系统 sudo yum update -y
3. 安装必要工具
# Debian/Ubuntu sudo apt install -y wget curl vim git unzip # CentOS/RHEL sudo yum install -y wget curl vim git unzip
第二步:安装和配置 Java 环境
这是运行 Java 项目的基础,强烈建议使用 SDKMAN! 来管理 Java 版本,因为它可以轻松地在多个版本间切换,且不影响系统环境。

1. 安装 SDKMAN!
curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh"
2. 使用 SDKMAN! 安装 JDK
安装一个长期支持版本 (LTS) 的 OpenJDK。
# 查看可用的 Java 版本 sdk list java # 安装指定版本的 JDK ( 17.0.9) sdk install java 17.0.9-tem # 设置为默认版本 sdk default java 17.0.9-tem
3. 验证安装
java -version # 应该显示你安装的版本信息, # openjdk version "17.0.9" 2025-10-17 # OpenJDK Runtime Environment Temurin-17.0.9+7 (build 17.0.9+7) # OpenJDK 64-Bit Server VM Temurin-17.0.9+7 (build 17.0.9+7, mixed mode, sharing) javac -version # 应该显示对应的编译器版本
最佳实践路径:
通过 SDKMAN! 安装的 JDK 通常位于用户主目录下的 .sdkman/candidates/java 中,/home/username/.sdkman/candidates/java/current,它已经自动配置好了环境变量,无需手动设置 JAVA_HOME。
第三步:创建项目部署目录
这是存放你的应用程序、配置和日志的地方,我们遵循一个清晰的目录结构。
1. 创建主目录
我们会将应用部署在 /opt 目录下,这是一个用于存放可选软件的标准位置。

sudo mkdir -p /opt/my-java-app sudo chown $USER:$USER /opt/my-java-app # 将所有权赋予当前用户,避免每次都用sudo cd /opt/my-java-app
2. 创建标准子目录结构
一个专业的项目目录结构如下:
mkdir -p {logs,config,lib,backup}
my-app.jar: 将你的 Java 应用程序 JAR 或 WAR 文件放在这里。config/: 存放你的配置文件(如application.properties,logback.xml)。最佳实践:不要将生产环境的配置文件打包进 JAR,而是外置。logs/: 存放应用程序生成的日志文件。lib/: 如果你有额外的依赖库 JAR 文件,可以放在这里(对于 Spring Boot 等现代框架通常不需要)。backup/: 用于存放旧版本的备份。
第四步:部署应用程序
假设你已经将你的 Java 项目打包成了 my-app-1.0.0.jar。
1. 上传项目文件
有多种方式可以将文件从本地上传到服务器:
-
使用
scp(简单直接)# 在你的本地电脑终端执行 scp my-app-1.0.0.jar username@your_server_ip:/opt/my-java-app/
-
使用
git(适合代码管理) 如果你的代码在 Git 仓库中,可以直接在服务器上拉取。cd /opt/my-java-app git clone https://github.com/your-repo/my-java-app.git . # 然后使用 Maven 或 Gradle 打包 ./mvnw clean package -DskipTests
-
使用 SFTP 客户端 使用 FileZilla, WinSCP 等图形化工具,通过 SFTP 协议拖拽上传。
2. 备份旧版本 (可选但推荐)
在部署新版本前,备份当前正在运行的版本。
# 假设当前运行的是 my-app-1.0.0.jar cp my-app-1.0.0.jar backup/my-app-1.0.0.jar.bak.$(date +%Y%m%d%H%M%S)
第五步:运行应用程序
1. 直接运行 (仅用于测试)
java -jar my-app-1.0.0.jar
这种方式会阻塞终端,Ctrl+C 后应用就停止了,不适合生产环境。
2. 使用 nohup 和 & (简单后台运行)
nohup java -jar my-app-1.0.0.jar > logs/app.log 2>&1 &
nohup: 让命令在用户退出登录后仍然继续运行。> logs/app.log: 将标准输出 重定向到日志文件。2>&1: 将标准错误 也重定向到标准输出所在的文件。&: 让命令在后台执行。
3. 使用 systemd (强烈推荐,生产环境标准)
systemd 是现代 Linux 发行版的标准初始化系统和服务管理器,使用它来管理你的应用,可以实现开机自启、状态监控、优雅停止等。
步骤:
-
创建
systemd服务文件sudo vim /etc/systemd/system/my-app.service
-
编写服务文件内容 将以下内容粘贴进去,并根据你的实际情况修改
User,ExecStart,WorkingDirectory等路径。[Unit] Description=My Java Application Service After=network.target [Service] # 运行服务的用户,建议不要用 root User=your_linux_username Group=your_linux_username # 工作目录,即你的应用部署目录 WorkingDirectory=/opt/my-java-app # 启动命令 ExecStart=/home/your_linux_username/.sdkman/candidates/java/current/bin/java -jar my-app-1.0.0.jar # JVM 内存参数 (非常重要!) # -Xms 是初始堆大小,-Xmx 是最大堆大小 # ExecStart=/home/your_linux_username/.sdkman/candidates/java/current/bin/java -Xms512m -Xmx1024m -jar my-app-1.0.0.jar # 重启策略 Restart=on-failure RestartSec=10 # 管理日志 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
-
启用并启动服务
# 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start my-app # 设置开机自启 sudo systemctl enable my-app
-
管理服务
# 查看服务状态 sudo systemctl status my-app # 查看实时日志 sudo journalctl -u my-app -f # 停止服务 sudo systemctl stop my-app # 重启服务 sudo systemctl restart my-app
第六步:高级主题与最佳实践
1. JVM 参数调优
对于生产环境,必须为你的应用分配合适的内存,通过 -Xms 和 -Xmx 设置 JVM 堆内存。
# 在 systemd 的 ExecStart 中添加 ExecStart=/path/to/java -Xms512m -Xmx1024m -XX:+UseG1GC -jar my-app.jar
-Xms512m: 初始堆大小为 512MB。-Xmx1024m: 最大堆大小为 1GB,这是最重要的参数,可以防止OutOfMemoryError。-XX:+UseG1GC: 使用 G1 垃圾回收器,是现代服务器的首选。
2. 使用反向代理 (Nginx)
如果你的应用是 Web 应用(如 Spring Boot WebFlux/Servlet),应该使用 Nginx 作为反向代理,Nginx 负责处理静态文件、SSL 终止、负载均衡,并将动态请求转发给你的 Java 应用。
-
安装 Nginx
# Debian/Ubuntu sudo apt install nginx # CentOS/RHEL sudo yum install nginx
-
配置 Nginx 创建一个配置文件,
/etc/nginx/sites-available/my-appserver { listen 80; server_name your_domain.com; # 你的服务器域名或IP location / { proxy_pass http://localhost:8080; # 假设你的Java应用监听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; } } -
启用配置并重启 Nginx
# 创建软链接以启用站点 sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/ # 测试配置文件语法 sudo nginx -t # 重启 Nginx sudo systemctl restart nginx
3. 日志管理
不要让日志文件无限增长,使用 logrotate 工具来自动轮转、压缩和删除旧日志。
创建配置文件 /etc/logrotate.d/my-app:
/opt/my-java-app/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 your_linux_username your_linux_username
postrotate
# 如果你的应用通过 systemd 管理,发送信号让它重新打开日志文件
systemctl reload my-app.service > /dev/null 2>&1 || true
endscript
}
一个标准的部署路径结构
/opt/my-java-app/ <-- 应用部署根目录
├── my-app-1.0.0.jar <-- 你的应用程序主文件
├── config/
│ └── application-prod.properties <-- 生产环境配置文件
├── logs/
│ ├── app.log.1 <-- 被logrotate轮转的旧日志
│ └── app.log <-- 当前日志
├── backup/
│ └── my-app-0.9.0.jar.bak.20251027103000 <-- 旧版本备份
└── scripts/
└── start.sh <-- 可选的启动脚本 (现在多用systemd)
遵循以上步骤,你就可以在 Linux 上专业、稳定、可维护地部署你的 Java 项目了。
