明朗北街七万号·数研工坊|扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地
适用场景#
如果你属于以下任一种情况,这篇对你有用:
- 内网环境要装任何 Java 系组件(Flink、Spark、SeaTunnel、Doris、各类微服务)
- 服务器上需要同时存在多个 JDK 版本(不同组件对版本要求不同)
- 刚装完系统,准备开始搭建数据平台(第 4 篇 GCC 之后)
- 遇到
java: command not found或UnsupportedClassVersionError
应用范围: 几乎所有大数据组件都运行在 JVM 上。JDK 装不对、环境变量配不好,后面 Flink/Spark/SeaTunnel 全部启动不起来。这是数据平台的第零号前置。
一、问题#
装好了系统,编译好了 GCC,接下来要装 Java 系组件。但:
java -version
# bash: java: command not foundplaintextJDK 从哪来?怎么装?装哪个版本?配哪些环境变量?——在内网环境,每一步都有讲究。
二、约束#
- 无公网,无法用
apt install openjdk或从 Oracle 官网下载 - 不同组件对 JDK 版本要求不同(Flink 1.14 要 Java 8/11,SeaTunnel 2.x 要 Java 8+,Doris 用 Java 8)
- 内网环境通常要长期维护,JDK 不能随意升级
- ARM 架构机器需要对应版本的 JDK
三、JDK 版本选择#
3.1 版本选哪个?#
| 组件 | 推荐 JDK |
|---|---|
| Flink 1.14+ | Java 8 / 11 |
| Spark 3.x | Java 8 / 11 / 17 |
| SeaTunnel 2.x | Java 8+ |
| Doris | Java 8(JDK 8 最稳) |
| Elasticsearch 7.x | Java 8 / 11 |
| Kafka 3.x | Java 8 / 11 |
| 自研 Spring Boot 服务 | Java 8 / 17 / 21 |
内网环境建议:优先 JDK 8,兼容性最好。 大数据组件对 Java 8 的支持最成熟。如果你有明确的新版本需求(如 Spring Boot 3 强制 Java 17+),再单独装 17。
版本选择逻辑:先看组件要求,再定 JDK,而不是先装最新 JDK。
3.2 下载哪个发行版?#
内网环境建议用 Eclipse Temurin(Adoptium) 或 OpenJDK:
# Temurin JDK 8 (x86_64)
wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u412b08.tar.gz
# Temurin JDK 11 (x86_64)
wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/11/jdk/x64/linux/OpenJDK11U-jdk_x64_linux_hotspot_11.0.23_9.tar.gz
# ARM64 (aarch64) 版本:把路径中的 x64 换成 aarch64
wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/aarch64/linux/OpenJDK8U-jdk_aarch64_linux_hotspot_8u412b08.tar.gzplaintext清华 TUNA 有 Adoptium 的完整镜像,路径规律:
/Adoptium/<版本>/jdk/<架构>/linux/<文件名>。 记住:架构后缀(x64 / aarch64)必须和服务器 CPU 匹配,否则启动直接报错。
四、离线安装 JDK#
4.1 推荐方式:tar.gz 解压(不用 rpm)#
rpm 安装的 JDK 会把文件散落到系统目录,不易管理。tar.gz 解压到统一目录,多版本共存更清晰:
# 创建统一目录
mkdir -p /usr/local/java
# 解压
tar xzf OpenJDK8U-jdk_x64_linux_hotspot_8u412b08.tar.gz -C /usr/local/java/
# 查看解压结果
ls /usr/local/java/
# jdk8u412-b08plaintext4.2 规范:使用软链接固定版本#
实际使用中经常要切换版本,用软链接把「当前版本」指到固定名字:
ln -sf /usr/local/java/jdk8u412-b08 /usr/local/java/currentplaintext之后配置环境变量指向 current,以后升级 JDK 只需要换软链接。
五、环境变量配置#
5.1 三个必须配置的变量#
export JAVA_HOME=/usr/local/java/current
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarplaintext- JAVA_HOME:Java 安装根目录。很多组件(Flink、Spark、Maven)通过它找 JDK
- PATH:让
java、javac命令可用 - CLASSPATH:类搜索路径。现代 Java 一般不需要手动配,但老组件可能依赖
5.2 写入全局配置(推荐)#
创建 /etc/profile.d/java.sh:
cat > /etc/profile.d/java.sh << 'EOF'
export JAVA_HOME=/usr/local/java/current
export PATH=$JAVA_HOME/bin:$PATH
EOFplaintext这样所有用户登录都会自动加载:
source /etc/profile
java -version
# openjdk version "1.8.0_412"plaintext5.3 系统级 vs 用户级#
| 位置 | 生效范围 | 适用场景 |
|---|---|---|
/etc/profile.d/*.sh | 所有用户 | 内网服务器推荐 |
/etc/profile | 所有用户(登录 shell) | 传统方式 |
~/.bashrc | 单个用户 | 个人开发机 |
~/.bash_profile | 单个用户(登录 shell) | macOS 习惯 |
内网多台机器建议统一用 /etc/profile.d/java.sh,这样所有机器配置一致,脚本化部署也方便。
六、多版本 JDK 共存#
6.1 场景#
Flink 要 Java 8,新的 Spring Boot 3 要 Java 17。共存方案:
# 两个 JDK 都解压到 /usr/local/java/
/usr/local/java/jdk8u412-b08
/usr/local/java/jdk-17.0.11
# 各自独立,通过软链接切换
ln -sf /usr/local/java/jdk8u412-b08 /usr/local/java/current # 切到 8
ln -sf /usr/local/java/jdk-17.0.11 /usr/local/java/current # 切到 17plaintext6.2 组件级指定(更精细)#
很多组件支持在启动脚本里指定 JAVA_HOME,不依赖全局变量:
# 以 Flink 为例,编辑 conf/flink-env.sh
export JAVA_HOME=/usr/local/java/jdk8u412-b08
# Spark 同理,spark-env.sh
export JAVA_HOME=/usr/local/java/jdk8u412-b08plaintext多版本共存的正确姿势:全局一个默认版本,组件各自指定所需版本。
七、验证与排障#
7.1 验证安装#
java -version
javac -version
echo $JAVA_HOMEplaintext7.2 常见坑#
坑 1:java: command not found
PATH 没配好。source /etc/profile 后再试。如果还是不行,确认 /etc/profile.d/java.sh 是否被执行(ls /etc/profile.d/ 检查文件权限,需要可读)。
坑 2:UnsupportedClassVersionError
JDK 版本太低。编译用的 JDK 版本高于运行环境。解决:升级 JDK 或降级编译目标(-source 1.8 -target 1.8)。
坑 3:Error: Could not create the Java Virtual Machine
内存不够。JVM 启动时申请的内存超过机器可用内存,调小 -Xmx。
坑 4:启动报 libjli.so: cannot open shared object file
少见但内网环境会遇到:JDK 解压到某个路径后目录被移动。重新解压到最终路径,或检查 $JAVA_HOME 路径是否真的存在。
坑 5:Unable to locate a Java Runtime
组件脚本找不到 JAVA_HOME。在组件配置里显式指定(6.2 节的做法)。
八、总结#
| 环节 | 关键动作 | 一句话 |
|---|---|---|
| 选版本 | 看组件要求,别追新 | 大数据组件默认 Java 8 |
| 下载 | Temurin,注意架构 x64/aarch64 | 架构错=装不上 |
| 安装 | tar.gz 解压到 /usr/local/java | 统一目录好管理 |
| 配置 | /etc/profile.d/java.sh | 全机器统一 |
| 多版本 | 软链接 current + 组件单独指定 | 全局一个默认 |
数据平台的第零号前置,就是把这五个字搞定:JAVA_HOME 对。
本文首发于掘金 · 作者:七万号 扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地