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

Java 运行环境必须装 JDK,不是 JRE
云服务器上运行 Java 应用(比如 Spring Boot jar),只装 jre 是不够的——编译、打包、调试、甚至某些运行时反射操作都依赖 javac 和 tools.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-devel(devel包含开发工具链) - 验证是否完整:
java -version && javac -version
两行都应输出版本号
JAVA_HOME 必须显式设置且路径要对
很多 Java 应用(尤其是 Spring Boot、Maven、Gradle)启动时会读取 JAVA_HOME 环境变量。云服务器上即使 java 命令可用,若 JAVA_HOME 指向错误目录(比如指向 /usr/lib/jvm/java-17-openjdk-amd64/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),但从本地浏览器打不开,大概率是云平台的安全组没开对应端口,或者服务器本地防火墙拦截了。
SmartB2B 是一款基于PHP、MySQL、Smarty的B2B行业电子商务网站管理系统,系统提供了供求模型、企业模型、产品模型、人才招聘模型、资讯模型等模块,适用于想在行业里取得领先地位的企业快速假设B2B网站,可以运行于Linux与Windows等多重服务器环境,安装方便,使用灵活。 系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板
立即学习“Java免费学习笔记(深入)”;
- Spring Boot 默认端口是
8080,检查是否监听:ss -tuln | grep :8080(不是netstat,新版系统默认没装) - 阿里云/腾讯云等控制台里,确认安全组规则已放行 TCP 8080(或你自定义的端口)
- 服务器本地防火墙(如
ufw或firewalld)也要开:sudo ufw allow 8080或sudo 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 指错、内存不设、端口不通,这些问题单独看都很浅,组合起来就让人反复重启查日志。真正省时间的做法,是把上面四步做成初始化脚本,每次新机器一键跑完。









