Java在云服务器上快速搭建运行环境的方法

云服务器运行Java应用必须安装JDK而非JRE,正确配置JAVA_HOME,显式设置JVM内存参数,开放安全组及防火墙端口。

Java 运行环境必须装 JDK,不是 JRE

云服务器上运行 Java 应用(比如 Spring Boot jar),只装 jre 是不够的——编译、打包、调试、甚至某些运行时反射操作都依赖 javactools.jar(JDK 9+ 合并进 lib/classes.jar)。很多一键脚本或镜像默认装的是 openjdk-17-jre-headless,直接跑 java -version 看似正常,但执行 javac 会报 command not found,后续构建或热部署失败。

  • Debian/Ubuntu 推荐安装:sudo apt install openjdk-17-jdk-headless-headless 表示无图形界面,适合服务器)
  • CentOS/RHEL 8+:用 dnf install java-17-openjdk-develdevel 包含开发工具链)
  • 验证是否完整:
    java -version && javac -version
    两行都应输出版本号

JAVA_HOME 必须显式设置且路径要对

很多 Java 应用(尤其是 Spring Boot、Maven、Gradle)启动时会读取 JAVA_HOME 环境变量。云服务器上即使 java 命令可用,若 JAVA_HOME 指向错误目录(比如指向 /usr/lib/jvm/java-17-openjdk-a

md64/jre),会导致类加载失败或 UnsupportedClassVersionError

  • 先查真实路径:readlink -f $(which java),结果类似 /usr/lib/jvm/java-17-openjdk-amd64/bin/java,则 JAVA_HOME 应设为 /usr/lib/jvm/java-17-openjdk-amd64
  • 写入全局配置(推荐):
    echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' | sudo tee -a /etc/profile.d/java.sh
    ,再 source /etc/profile.d/java.sh
  • 不要用 update-alternatives --config java 后自动推导 JAVA_HOME,它不保证变量同步

Spring Boot jar 直接运行,但别漏掉 -D 参数和内存限制

上传好 app.jar 后,直接 java -jar app.jar 能跑通,但生产环境极易出问题:默认堆内存太小(通常 1/4 物理内存)、没有指定配置文件位置、日志输出到控制台无法持久化。

  • 最小可用命令:
    nohup java -Xms512m -Xmx1024m -Dspring.config.location=file:/opt/app/config/ -jar /opt/app/app.jar > /opt/app/logs/stdout.log 2>&1 &
  • -Xms/-Xmx 必须显式设,否则 JVM 可能因内存抖动被 OOM killer 杀掉
  • -Dspring.config.location 指向外部配置目录,避免每次更新 jar 都要重打包
  • nohup + & 启动后,检查进程:ps aux | grep app.jar,确认是 java 进程而非 sh 进程在跑

别跳过防火墙和安全组端口放行

应用明明启动成功(日志里出现 Started Application in X seconds),但从本地浏览器打不开,大概率是云平台的安全组没开对应端口,或者服务器本地防火墙拦截了。

  • Spring Boot 默认端口是 8080,检查是否监听:ss -tuln | grep :8080(不是 netstat,新版系统默认没装)
  • 阿里云/腾讯云等控制台里,确认安全组规则已放行 TCP 8080(或你自定义的端口)
  • 服务器本地防火墙(如 ufwfirewalld)也要开:sudo ufw allow 8080sudo firewall-cmd --permanent --add-port=8080/tcp
  • 如果用反向代理(Nginx),确保 Nginx 配置里 proxy_pass http://127.0.0.1:8080,且 Spring Boot 的 server.forward-headers-strategy=framework(处理 X-Forwarded-* 头)

Java 环境本身不复杂,但云服务器上每个环节都卡在“默认值不适用生产”——JDK 缺组件、JAVA_HOME 指错、内存不设、端口不通,这些问题单独看都很浅,组合起来就让人反复重启查日志。真正省时间的做法,是把上面四步做成初始化脚本,每次新机器一键跑完。