90%的linux下scala安装失败源于jdk配置错误:必须确保java -version与javac -version均≥1.8(推荐openjdk 11+),java_home指向含bin/javac的jdk根目录,且$java_home/bin在path最前端;验证需三步:检查版本一致性、确认java_home非空且含javac、比对which java与$java_home/bin/java路径。

Scala 在 Linux 上装不起来,90% 是因为 Java 没配对——不是“装了 Java 就行”,而是 java -version ≥ 1.8(推荐 OpenJDK 11)、JAVA_HOME 指向 JDK 根目录(含 bin/javac),且 $JAVA_HOME/bin 必须在 $PATH 前段。跳过验证直接装 Scala,必然遇到 Command 'scala' not found 或更隐蔽的 java.lang.NoClassDefFoundError: java/nio/file/Paths。
验证 JDK 是否真正就位
别只信 java -version,它可能来自 JRE 或低版本系统包。必须同时检查:
-
java -version和javac -version输出一致,且版本号 ≥ 11(Scala 3)或 ≥ 8(Scala 2.12+) -
echo $JAVA_HOME非空,且路径下存在bin/javac(运行$JAVA_HOME/bin/javac -version确认可执行) -
which java返回路径应与$JAVA_HOME/bin/java一致;若不一致,说明PATH里有其他 Java 干扰
Ubuntu/Debian 推荐:sudo apt install openjdk-17-jdk;CentOS/RHEL 推荐:sudo dnf install java-17-openjdk-devel。手动解压 JDK 的用户,务必把 JAVA_HOME 设为解压后的完整路径(如 /opt/jdk-17.0.1),不要设成 /opt/jdk-17.0.1/jre。
用 Coursier 安装 Scala 3(推荐方式)
官方已弃用传统二进制包分发,Coursier 是目前最轻量、版本管理最干净的方式,尤其适合 Scala 3。它自动处理 scala、scalac、scaladoc 软链,并避免与系统旧版冲突。
- 先下载并安装
cs:x86_64 机器执行curl -fL https://github.com/coursier/launchers/raw/master/cs-x86_64-pc-linux.gz | gzip -d > cs && chmod +x cs && ./cs setup - 安装指定 Scala 3 版本(别用
cs install scala@3,它默认拉旧版):cs install scala:3.3.3(查最新版见 GitHub releases) - 确认
~/.local/bin已加入PATH(写入~/.bashrc或~/.zshrc):export PATH="$HOME/.local/bin:$PATH" - 新开终端后运行
scala -version,输出应为Scala code runner version 3.3.3
用二进制包安装 Scala 2.12/2.13(大数据生产环境首选)
Spark/Flink/Hadoop 生态仍普遍依赖 Scala 2.x 字节码,直接装 Scala 3 可能导致 UDF 加载失败、反射异常或 YARN 提交流程崩溃。此时应选官网稳定版(如 scala-2.12.20.tgz),而非系统包管理器里的旧版(Ubuntu 22.04 自带的 2.13.6 常缺 scalac)。
- 解压到固定位置:
tar -zxvf scala-2.12.20.tgz -C /opt/,然后创建软链便于升级:sudo ln -sf /opt/scala-2.12.20 /opt/scala - 配置全局环境变量(追加到
/etc/profile):export SCALA_HOME=/opt/scala-2.12.20和export PATH=$SCALA_HOME/bin:$PATH(注意顺序:必须放$PATH最前,否则可能被/usr/bin/scala覆盖) - 生效:
source /etc/profile,再开新终端验证scala -version和scalac -version - 别把包解压到
/tmp或家目录——权限不稳定,多用户共享时路径不可靠
容易被忽略的关键细节
很多看似“装好了”的环境,实际跑 Spark 任务或编译项目时突然崩,问题往往藏在这些地方:
-
spark-shell启动的是 Scala 2.x REPL,不能直接输入 Scala 3 语法(比如def f(x: Int): Int = x * 2会报错,得写成老式def f(x: Int) = x * 2) - 用 sbt 编译 Scala 3 项目时,若要兼容 Spark 运行时,必须显式加
-target:jvm-11参数,否则字节码不匹配 -
/etc/profile修改后只对新终端生效,别只在当前 shell 测试完就认为 OK;用echo $PATH确认/opt/scala-2.12.20/bin真出现在最前面 - 中文乱码不是 Scala 问题,是终端编码或 JVM 启动参数缺失,需在
scala脚本里加-Dfile.encoding=UTF-8











