杰瑞科技汇

Linux部署Java项目路径怎么配置?

核心思想:分离环境、应用和配置

一个专业且易于维护的部署,应该将以下三者清晰地分开:

Linux部署Java项目路径怎么配置?-图1
(图片来源网络,侵删)
  1. Java 环境 (JDK/JRE): 系统级的运行时环境。
  2. 应用本身: 你的 Java 打包后的文件(如 JAR, WAR)。
  3. 配置文件: 数据库连接、日志级别、应用参数等。

第一步:准备工作

在部署应用之前,确保你的 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 版本,因为它可以轻松地在多个版本间切换,且不影响系统环境。

Linux部署Java项目路径怎么配置?-图2
(图片来源网络,侵删)

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 目录下,这是一个用于存放可选软件的标准位置。

Linux部署Java项目路径怎么配置?-图3
(图片来源网络,侵删)
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 发行版的标准初始化系统和服务管理器,使用它来管理你的应用,可以实现开机自启、状态监控、优雅停止等。

步骤:

  1. 创建 systemd 服务文件

    sudo vim /etc/systemd/system/my-app.service
  2. 编写服务文件内容 将以下内容粘贴进去,并根据你的实际情况修改 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
  3. 启用并启动服务

    # 重新加载 systemd 配置
    sudo systemctl daemon-reload
    # 启动服务
    sudo systemctl start my-app
    # 设置开机自启
    sudo systemctl enable my-app
  4. 管理服务

    # 查看服务状态
    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 应用。

  1. 安装 Nginx

    # Debian/Ubuntu
    sudo apt install nginx
    # CentOS/RHEL
    sudo yum install nginx
  2. 配置 Nginx 创建一个配置文件,/etc/nginx/sites-available/my-app

    server {
        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;
        }
    }
  3. 启用配置并重启 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 项目了。

分享:
扫描分享到社交APP
上一篇
下一篇