新手如何在干净的服务器上搭建Java项目的运行环境?

在干净的 Linux 服务器(以国内最常见的 CentOS 7/8、Ubuntu 20.04/22.04 或 Alibaba Cloud Linux 为例)上搭建 Java 运行环境,核心逻辑只有三步:安装 JDK -> 配置环境变量 -> 验证与优化。

作为“知乎大神”视角的实操指南,我不会只给你扔命令,而是会告诉你为什么这么做以及避坑指南。


第一步:选择并安装 JDK(推荐 OpenJDK)

对于生产环境,强烈建议使用 OpenJDK 而非 Oracle JDK。理由如下:

  1. 开源免费:无商业授权风险。
  2. 生态统一:Spring Boot、Tomcat 等主流框架默认基于 OpenJDK 测试。
  3. 长期支持(LTS):版本稳定,适合企业级应用。

方案 A:使用系统包管理器安装(最简单,推荐新手)

CentOS/RHEL/Alibaba Cloud Linux:

# 更新源
sudo yum update -y

# 安装 OpenJDK 17 (目前主流 LTS 版本)
sudo yum install java-17-openjdk java-17-openjdk-devel -y

Ubuntu/Debian:

sudo apt update
sudo apt install openjdk-17-jdk -y

注意:如果你必须使用 Java 8(很多老项目仍依赖),请将 17 替换为 1.8 或 8。但在新项目中,建议直接上 Java 17。

方案 B:手动下载解压(更灵活,适合特定版本)

如果系统源里没有你想要的版本,或者你需要指定路径:

  1. 前往 Adoptium (Eclipse Temurin) 或 Oracle 下载 .tar.gz 包。
  2. 上传到服务器 /usr/local/java 目录(需先创建目录)。
  3. 解压:
    tar -zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java/
  4. 重命名以便管理(可选):
    mv /usr/local/java/jdk-17.xxx /usr/local/java/jdk17

第二步:配置环境变量(关键步骤)

无论采用哪种安装方式,都必须让系统知道 java 和 javac 命令在哪里。

  1. 编辑 /etc/profile 文件:

    sudo vi /etc/profile
  2. 在文件末尾添加以下内容(根据你的实际安装路径调整):

    # Java Environment Variables
    export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64  # Ubuntu 示例路径
    # export JAVA_HOME=/usr/lib/jvm/java-17-openjdk        # CentOS 示例路径
    # export JAVA_HOME=/usr/local/java/jdk17               # 手动解压示例路径
    
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
  3. 保存退出后,使配置立即生效:

    source /etc/profile
  4. 验证是否成功:

    java -version
    javac -version
    echo $JAVA_HOME

    如果输出了正确的版本号,说明配置成功。


第三步:部署 Java 项目(JAR 包运行最佳实践)

不要直接用 java -jar app.jar & 这样简单粗暴的方式,这在重启后会丢失进程,且日志混乱。推荐使用 Systemd 管理服务。

1. 创建项目目录

sudo mkdir -p /opt/myapp
cd /opt/myapp
# 将你的 .jar 包上传到这里

2. 编写 Systemd 服务文件

创建文件 /etc/systemd/system/myapp.service:

[Unit]
Description=My Java Application
After=syslog.target network.target

[Service]
User=root
Group=root
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar myapp.jar
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

参数解释:

  • -Xms512m -Xmx1024m:设置堆内存初始值和最大值,防止 OOM(内存溢出)或频繁 GC。根据服务器内存调整。
  • Restart=on-failure:程序崩溃后自动重启。

3. 启动并设置开机自启

# 重载 systemd 配置
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start myapp

# 设置开机自启
sudo systemctl enable myapp

# 查看状态
sudo systemctl status myapp

# 查看实时日志(替代 tail -f)
sudo journalctl -u myapp -f

第四步:安全组与防火墙配置(国内云厂商必做)

这是新手最容易忽略的一步。Java 项目跑起来了,但网络访问不了!

  1. 云服务器控制台(阿里云/腾讯云/AWS等):

    • 找到你的实例 -> 安全组 -> 入方向规则。
    • 添加规则:允许 TCP 协议,端口范围为你项目配置的端口(如 8080, 8090 等),来源 IP 设为 0.0.0.0/0(或指定 IP 段以提高安全性)。
  2. 服务器内部防火墙:

    • CentOS 7+:
      sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
      sudo firewall-cmd --reload
    • Ubuntu:
      sudo ufw allow 8080/tcp
      sudo ufw reload

高级优化建议(进阶)

  1. 时区问题:
    服务器默认时区可能是 UTC,导致日志时间与本地时间不一致。

    timedatectl set-timezone Asia/Shanghai

    或在 JVM 启动参数中加上:-Duser.timezone=GMT+8

  2. 大文件上传限制:
    Spring Boot 默认最大上传文件可能较小,需在 application.yml 中配置:

    spring:
      servlet:
        multipart:
          max-file-size: 100MB
          max-request-size: 100MB
  3. 监控与运维:

    • 安装 htop 或 btop 实时监控资源。
    • 考虑接入 Prometheus + Grafana 监控 JVM 指标(堆内存、GC 次数等)。
  4. 容器化趋势(Docker):
    如果条件允许,强烈建议学习 Docker。将上述所有步骤封装进 Dockerfile,可以彻底解决“在我机器上能跑”的问题,且迁移方便。

    FROM eclipse-temurin:17-jre
    WORKDIR /app
    COPY myapp.jar /app/myapp.jar
    ENTRYPOINT ["java", "-Xms512m", "-Xmx1024m", "-jar", "/app/myapp.jar"]

常见坑点总结

问题现象 可能原因 解决方案
command not found: java 环境变量未生效或未配置 执行 source /etc/profile,检查 echo $JAVA_HOME
中文乱码 服务器缺少中文字体或编码不一致 安装字体库,确保项目文件和 JVM 都使用 UTF-8
连接被拒绝 安全组未放行或防火墙拦截 检查云厂商控制台安全组和 firewall-cmd/ufw
内存溢出 (OOM) JVM 堆内存设置过小 调整 -Xmx 参数,或排查代码内存泄漏
端口占用 之前有残留进程 使用 lsof -i:8080 查找并 kill 进程

按照以上步骤,你可以在 10-15 分钟内完成一个干净、稳定、可维护的 Java 生产环境搭建。记住:规范的环境变量管理和 Systemd 服务管理是专业性的体现。

未经允许不得转载:CLOUD云枢 » 新手如何在干净的服务器上搭建Java项目的运行环境?