在干净的 Linux 服务器(以国内最常见的 CentOS 7/8、Ubuntu 20.04/22.04 或 Alibaba Cloud Linux 为例)上搭建 Java 运行环境,核心逻辑只有三步:安装 JDK -> 配置环境变量 -> 验证与优化。
作为“知乎大神”视角的实操指南,我不会只给你扔命令,而是会告诉你为什么这么做以及避坑指南。
第一步:选择并安装 JDK(推荐 OpenJDK)
对于生产环境,强烈建议使用 OpenJDK 而非 Oracle JDK。理由如下:
- 开源免费:无商业授权风险。
- 生态统一:Spring Boot、Tomcat 等主流框架默认基于 OpenJDK 测试。
- 长期支持(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:手动下载解压(更灵活,适合特定版本)
如果系统源里没有你想要的版本,或者你需要指定路径:
- 前往 Adoptium (Eclipse Temurin) 或 Oracle 下载
.tar.gz包。 - 上传到服务器
/usr/local/java目录(需先创建目录)。 - 解压:
tar -zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java/ - 重命名以便管理(可选):
mv /usr/local/java/jdk-17.xxx /usr/local/java/jdk17
第二步:配置环境变量(关键步骤)
无论采用哪种安装方式,都必须让系统知道 java 和 javac 命令在哪里。
-
编辑
/etc/profile文件:sudo vi /etc/profile -
在文件末尾添加以下内容(根据你的实际安装路径调整):
# 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 -
保存退出后,使配置立即生效:
source /etc/profile -
验证是否成功:
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 项目跑起来了,但网络访问不了!
-
云服务器控制台(阿里云/腾讯云/AWS等):
- 找到你的实例 -> 安全组 -> 入方向规则。
- 添加规则:允许 TCP 协议,端口范围为你项目配置的端口(如 8080, 8090 等),来源 IP 设为
0.0.0.0/0(或指定 IP 段以提高安全性)。
-
服务器内部防火墙:
- 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
- CentOS 7+:
高级优化建议(进阶)
-
时区问题:
服务器默认时区可能是 UTC,导致日志时间与本地时间不一致。timedatectl set-timezone Asia/Shanghai或在 JVM 启动参数中加上:
-Duser.timezone=GMT+8 -
大文件上传限制:
Spring Boot 默认最大上传文件可能较小,需在application.yml中配置:spring: servlet: multipart: max-file-size: 100MB max-request-size: 100MB -
监控与运维:
- 安装
htop或btop实时监控资源。 - 考虑接入 Prometheus + Grafana 监控 JVM 指标(堆内存、GC 次数等)。
- 安装
-
容器化趋势(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云枢