
做了这么多年的后端开发Scala这门语言在我接触过的技术栈里属于那种“第一眼觉得没必要深入了解后真香”的类型。它既能像Java一样跑在JVM上无缝复用海量Java生态又比Java写起来灵活得多函数式写法一旦上手处理数据逻辑的效率确实很高。尤其是你准备搞Spark这类大数据框架Scala基本是绕不开的选项。前阵子帮项目组几个新人一起配开发环境用的是Scala 2.12.15和IDEA 2021.1.3虽然网上教程一搜一大把但真按那些步骤走坑还真不少。这篇文章就是我踩完坑之后整理的完整过程从版本选择到IDEA配置全部走一遍给同样要入门的同学一个参考。这篇内容适合两类人看一类是刚从Java转过来、想快速把Scala开发环境跑起来的后端工程师另一类是学校或培训班里准备上Spark课程、需要在本机搭建Scala开发环境的同学。不需要你有多深的JVM基础只要会基本的Java环境配置跟着步骤走就行。1. 版本选型梳理与为什么是这组组合1.1 Scala版本号背后的兼容性逻辑很多人上来就装最新版Scala这其实是环境搭建里最容易埋雷的地方。Scala有一个特点小版本号之间的编译产物并不完全兼容。用Scala 2.13写的库放到Scala 2.12的项目里经常直接给你抛一串“missing dependency”或者二进制不兼容的报错。而目前大数据生态里最主流的Spark框架我印象中Spark 3.2及之前的版本都是基于Scala 2.12构建的这导致2.12.x成了大数据方向最稳妥的选择。我选的2.12.15是这个系列里的一个偏后期维护版本修了很多早期2.12版本暴露出来的编译器问题同时也比2.13系列稳。如果你用的是IDEA 2021.1.3这个版本的IDE本身对Scala 2.12的支持做得已经比较完善了所以两者搭在一起属于那种“不会太新、但绝对够用”的状态。1.2 IDEA版本与Scala插件之间的匹配关系IDEA的Scala插件并不是内置的默认插件需要手动去插件市场安装。这里有个值得注意的细节IDEA 2021.1.x系列对应的是Scala插件2021.1.x版本线如果插件版本和IDEA主版本差异太大插件可能直接无法加载或者在创建工程时看不见Scala选项。为什么要选2021.1.3而非更老的版本主要原因是它在Maven和Gradle的集成上做了一些稳定性优化对国内网络环境下常用的阿里云镜像仓库支持也更友好。这一步选型直接影响后面的构建速度我第一次帮同事配的时候用的是2020.3版本明明插件装上了命令行编译正常但IDEA内部一跑sbt就卡在依赖解析上和网络设置还有插件兼容都有关系折腾了将近一个小时。换成2021.1.3之后同样的问题再没出现过。1.3 配套JDK版本需要统一规划Scala毕竟跑在JVM上所以JDK版本直接决定了你编译出来的字节码能不能正常运行。2.12.15这个版本的Scala官方推荐的JDK版本是8也就是JDK 8u系列。虽然你用JDK 11甚至JDK 17也能跑大部分功能但在某些注解处理和反射调用的场景下可能会触发一些奇怪的适配问题。我的建议很简单装主JDK 8作为系统默认IDEA里面也统一指定为JDK 8。这样不仅Scala编译顺畅和你手头可能已有的Java项目、Maven项目也完全兼容不冲突。别为了新鲜去上JDK 17Scala 2.12.15在高版本JDK下跑反射调用时有时候会报模块访问限制的警告虽然不影响功能但排查起来很影响心情。下面是这套组合的选型汇总方便你对照自己机器上的已有环境判断是否有冲突组件我使用的版本选择原因注意事项JDK1.8.0_291Scala 2.12官方推荐版本兼容性最好不要选JDK 11或更高作为默认Scala2.12.15Spark 3.x主流兼容版本稳定成熟2.12系列内部小版本差异不大IDEA2021.1.3对Scala插件集成好依赖下载稳定尽量别低于2020.3构建工具sbt 1.5.xScala官方主推符合社区习惯可改Maven或Gradle但sbt最省心2. 环境准备与前置条件检查2.1 操作系统与机器配置建议Scala属于JVM系语言理论上三大平台Windows、macOS、Linux都能跑。但我这几年的实际体验是Windows下需要注意的环境变量坑最多最容易出现装好命令行能用、IDEA里却识别不了的情况macOS和Linux相对省心一点但也需要在权限和PATH配置上多留个心眼。先说机器配置。如果你只是学语法、写点小例子4G内存就够用了。但如果你想拿Scala来跑一些数据处理的练习比如用集合框架处理十万级以上的数据或者启动Spark本地模式我个人建议至少8G内存IDE加上编译进程才不会有明显卡顿。磁盘剩50G以上基本没问题Scala本身只占几百M主要是IDE缓存和依赖库会慢慢变大。2.2 确认本机是否已安装Java并查看版本这一步看似基础但真的经常有人翻车。我自己遇到过好几种情况有人电脑里装了多个JDK环境变量指来指去有人用的Mac系统自带的Java版本很老还有人装的是JRE而不是JDKIDE运行没问题但编译时Scala编译器需要的是JDK的完整工具链。检查的方法很简单在终端或命令行里跑java -version javac -version echo $JAVA_HOME这里java -version看的是运行环境javac -version看的是编译器echo $JAVA_HOME查看你配置的JDK路径。如果前两个能正常输出版本信息但第三个是空的说明你的JAVA_HOME没配或者配了但当前终端窗口没刷新。IDEA在新建Scala项目时通常会根据JAVA_HOME来关联JDK所以这个必须保证存在。如果你发现javac提示找不到命令说明你只装了JRE不是完整JDK。这种就直接去下载JDK 8安装别在JRE基础上硬凑。2.3 必要时先清干净本机的旧版Scala有些同学之前可能因为好奇心装过其他版本的Scala比如3.x的早期版本或者2.11、2.13之类的。这一节专门提醒一下不清干净旧版本后面极容易出现命令行版本和IDE内置版本不一致的问题编译结果也会跟着犯迷糊。清理方式在Windows上是去“控制面板-程序和功能”找到Scala相关的卸载项卸载然后把环境变量里指向旧版本的SCALA_HOME和PATH记录删掉。macOS上一般是通过Homebrew装的运行brew uninstall scala即可。如果你的旧版本是手动解压的直接把解压目录删了就行。我的一个习惯是把所有和开发环境相关的安装目录、版本号整理成一份记录文件放在项目根目录。比如“jdk-1.8.0_291”、“scala-2.12.15”、“IDEA-2021.1.3”后面出了问题排查范围一下就缩小了。3. Scala-2.12.15安装包获取与命令行验证3.1 官方下载渠道识别与国内加速方法很多教程会让新手直接去Scala官网下载但官网的下载链接其实会跳转到GitHub的Release页面国内网络拉取动不动就超时。这里我推荐几种更实际的获取方式第一种是直接从GitHub手动下载tgz或msi安装包用浏览器配合下载工具速度不行就换镜像源。第二种是用包管理器安装Windows下可以用scoop install scalamacOS下用brew install scala但这种方式的缺点是安装的版本不一定完全受你控制可能装出来是2.13.x。第三种最稳妥在官网找到对应版本的存档页面选择“Previous Releases”链路进入然后从GitHub Releases中手动选择scala-2.12.15.zip下载。我自己在Windows上习惯用zip包解压的方式因为不想让安装程序自动改注册表后续换版本方便直接删目录就行。macOS上则用命令行工具解压mkdir -p ~/dev/scala cd ~/dev/scala # 把下载的 scala-2.12.15.zip 放到这个目录 unzip scala-2.12.15.zip3.2 配置SCALA_HOME与PATH环境变量解压完之后核心任务是让系统知道Scala命令在哪里。配置环境变量这一步在Windows上并不复杂但有90%的坑都出现在细节上。我拆开了说。Windows 10以上的系统直接在“此电脑”右键进入属性-高级系统设置-环境变量。在“系统变量”里点击新建变量名填SCALA_HOME变量值填你的Scala解压目录比如C:\dev\scala-2.12.15。注意这里不要带bin目录后面配置PATH时会用到。然后在系统变量列表里找到Path双击编辑在末尾追加一条%SCALA_HOME%\bin。这里有两个常见误区一是把路径直接写成C:\dev\scala-2.12.15\bin这种写法形式上也正确但万一你以后切版本每个版本都要过来改一遍不如用变量引用省心二是忘记在条目之间加分隔符老版本系统里是分号Windows 10的新编辑界面每条占一行点“新建”即可。macOS或Linux下配置则是在~/.zshrc或~/.bash_profile中追加export SCALA_HOME$HOME/dev/scala-2.12.15 export PATH$PATH:$SCALA_HOME/bin加完执行source ~/.zshrc让配置生效。3.3 用命令行验证安装是否成功环境变量配置完重新打开一个终端窗口输入scala -version看到输出类似Scala code runner version 2.12.15就说明命令行环境没问题。这一步再顺手验证一下编译命令scalac -version如果能正常输出版本接下来做一个最简单的小实验确认编译器可用。写一个hello.scala文件object Hello { def main(args: Array[String]): Unit { println(Hello, Scala) } }然后执行scalac hello.scala scala Hello如果输出Hello, Scala说明从编译到运行整条链路都通了。这一步虽然看起来多余但能帮你提前判断是不是环境变量配错了如果这步有问题后面到了IDEA里再去排查代价会大得多。4. IDEA 2021.1.3安装与Scala插件配置4.1 安装IDEA并完成基础初始化设置IDEA的安装包获取建议直接去JetBrains官网下载选Community版本也够用了毕竟Scala开发和Java开发的基础功能社区版都覆盖了没必要为了学习去折腾专业版的授权问题。安装过程本身比较傻瓜式需要注意的就两点一是勾选“Create Associations”关联.scala文件有的版本也叫“Associate File Types”这样你双击.scala文件会默认用IDEA打开二是安装目录尽量不要放在C盘。你要是默认路径装完后面积累的缓存和索引可能把系统盘塞得难受。第一次启动IDEA会有一个引导设置页面选“Do not import settings”即可然后会让你选主题、装推荐的插件这一步先不用管其他花里胡哨的插件。重点是在弹出的“Customize IDEA”页面里确认JRE路径默认使用的是内置的JBR 11也不怕因为后面创建Scala项目时项目SDK会单独指定JDK 8。4.2 在IDEA内部安装Scala插件IDEA 2021.1.3默认是不带Scala插件的所以需要手动安装。具体操作是进入File菜单选择Settings在左侧列表里找到Plugins然后点击顶部的“Marketplace”标签页在搜索框里输入“Scala”。这里有一个值得注意的点搜索结果里可能出现两个相似插件一个叫做“Scala”另一个可能是旧版本的“Scala Language”或是第三方插件。一定要认准由JetBrains官方发布的那个别装错了影响后续使用。如果插件市场访问比较慢可以考虑配置代理或者在“Plugins”界面的设置里手动安装从JetBrains插件仓库下载的zip包但正常网络下直接在Marketplace装即可。点击Install按钮之后等待下载完成然后务必重启IDEA让插件生效。很多人在这一步跳过了重启后面新建项目死活找不到Scala选项第一反应是插件没装上其实只是没重启。4.3 配置IDEA中的JDK和Scala SDK重启之后打开IDEA的Project Structure快捷键CtrlAltShiftS在左侧选择“Global Libraries”看里面是否已经有Scala相关的SDK记录。如果没有点击加号选择“Scala SDK”在弹出的窗口里点“Browse”定位到你解压的Scala目录IDEA会自动识别版本号显示为2.12.15。然后是配置项目SDK。如果你手头已经有项目点开Project Structure里的“Project”选项把Project SDK设为1.8如果下拉列表里面没有JDK 8就点“Add SDK”手动指定你安装的JDK 1.8目录。这一步让我想起同事们经常问的问题“IDEA自带了JDK为什么还要额外指定”因为自带的那个只是IDEA运行环境自带的JBR并不是你项目编译环境项目SDK必须显式指定。配置项和含义放在一起看更直观配置项位置填写内容含义Project SDKProject Structure - Project1.8项目编译和运行的JDK版本Global Libraries - Scala SDKProject Structure - Global Libraries2.12.15Scala编译器位置Module SDKProject Structure - Modules1.8模块级JDK覆盖默认继承Project配置5. 创建Scala工程并跑通第一个HelloWorld5.1 新建Project时的关键选项选择IDEA准备就绪后点击“New Project”按钮左侧类型列表你会看到多了一项“Scala”。选中它右侧会让你选择项目模板这里一般选“IDEA”这个简单模板就行不需要勾选sbt或Maven模板等以后真的需要构建复杂项目时再切回这些工具。不过这里我要给一个建议如果你大概率之后要做Spark相关开发不如直接选“sbt”模板。sbt是Scala社区的标准构建工具它能把依赖管理、编译、打包一体化搞定。虽然首次创建项目时sbt会去下载依赖库网络不好时会等一会儿但这一步迟早要过现在早适应对后面帮助更大。我在实际配置时选了sbt模板因为手里正好有Spark练习项目要跑一次性省了很多事。在创建向导中需要指定项目SDK和Scala SDK。Project SDK选1.8Scala SDK选2.12.15其余默认。创建一个名为ScalaDemo的项目。项目创建完成后IDEA左下角会有一个sbt进程在跑主要是下载Scala编译器和sbt运行依赖。这个过程我第一次等了三五分钟耐心等就好别手痒去改什么配置。如果进度卡住一直不动八成是网络问题去sbt\conf目录下把repositories文件里的仓库地址替换成阿里云镜像具体做法网上都有这里不展开但这是实际开发中很常见的优化手段。5.2 目录结构理解与第一个.scala文件创建好的sbt项目目录结构如下ScalaDemo/ ├── build.sbt ├── project/ │ ├── build.properties │ └── plugins.sbt └── src/ ├── main/ │ ├── java/ │ └── scala/ │ └── Hello.scala └── test/ ├── java/ └── scala/build.sbt是项目构建定义文件里面一般有两行核心配置name : ScalaDemo和scalaVersion : 2.12.15。src/main/scala是我们的源码目录在它下面新建一个Hello.scala输入object Hello { def main(args: Array[String]): Unit { println(Hello, Scala! This is my first program.) } }这里补一句Scala的入口方法定义在object里而不是像Java那样定义在class里用object修饰的是单例对象直接在main里写执行逻辑。5.3 运行方式和输出验证写完代码后在Hello.scala文件里右击选择“Run Hello”IDEA会自动调用sbt编译并运行。第一次运行速度可能比较慢因为sbt需要编译整个启动器等右下角进度条消失、控制台打印出Hello, Scala! This is my first program.这次环境搭建就算彻彻底底跑通了。如果你用的是简单的IDEA模板而不是sbt运行方式更简单右击同样可以跑。但要注意类名和文件名必须一致Scala和Java在这点上保持了相同的习惯。还有一种方式是直接在IDEA的Terminal面板输入sbt run或scala Hello效果一样但走sbt会重新做一次完整编译速度上不如直接调用IDEA的Run快捷按钮。5.4 配置sbt国内镜像源避免依赖下载缓慢前面提到首次创建sbt项目的下载耗时问题这里把配置方法补完整。在sbt的安装目录下或者用户目录的.sbt目录中找到repositories文件如果没有就手动创建一个内容配置如下[repositories] local aliyun: https://maven.aliyun.com/repository/public aliyun-central: https://maven.aliyun.com/repository/central aliyun-releases: https://maven.aliyun.com/repository/releases typesafe: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly maven-central: https://repo1.maven.org/maven2/配置完之后每次sbt拉取依赖都会先走阿里云的镜像速度会快非常多。这是我个人强烈建议的一步尤其在网络环境不太稳定的情况下它能直接决定你今天的教程体验是“一路顺畅”还是“卡到怀疑人生”。5.5 验证项目中的Scala运行环境最后在IDEA的工具栏上打开View——Tool Windows——sbt能看到当前项目的sbt版本、Scala版本以及所有定义好的任务。这个面板是一个好东西可以用来编译、测试、打包。比如双击compile任务控制台会输出编译结果双击package任务会生成jar包。看到这些任务能正常执行说明IDEA、Scala、sbt三者已经完全打通。6. 常见问题排查与避坑手册6.1 命令行可用但IDEA中找不到Scala SDK这个问题非常典型。用户在终端里scala -version正常输出版本进入IDEA的Project Structure按加号添加Scala SDK时弹窗里却看不到任何可用版本只能点Browse手动选择目录。最直接的原因就是IDEA没有读取到SCALA_HOME环境变量尤其是Windows下配置环境变量后IDEA是旧进程环境变量变更不会自动生效。解决办法是完整退出IDEA再重新启动不要在IDEA的Settings里尝试刷新环境变量容易白忙活。如果重启之后还是找不到建议手动Browse直接定位到scala-2.12.15根目录。6.2 新建Project时看不到Scala类型入口前面在插件那一节已经提过装了插件必须重启IDEA。但还有一种情况就是插件确实装上了新建项目时左侧类型列表切到“Scala”右侧却是空的只有“Java”选项。这种情况通常是IDEA的Scala插件没有被正确加载Windows上有时因为防火墙或代理拦截插件文件没有完整下载导致安装是半成品状态。解决方法是去Settings——Plugins里找到Scala插件先点Uninstall卸载然后重启IDEA重新进入Marketplace安装一次。我帮同事处理这个问题时发现这种重装法的成功率接近百分百。6.3 编译报错“scala: error while loading ...”这种报错常见于Scala版本和JDK版本不匹配的情况。我在配置期间有一次在JDK 16环境下跑Scala 2.12.15编译时不断跳出类似“error while loading class file ... invalid constant type”的信息。这就是JDK版本太新、Scala编译器不识别新版class文件常量池导致的。遇到这个问题直接把项目Project Structure里的Project SDK改成1.8即可同时确认一下IDEA右下角是否有多个Java版本标记。如果改完还报错就去命令行跑一下java -version确认系统默认的确实是JDK 8再试。6.4 乱码问题控制台输出中文异常Scala程序里的中文println输出到IDEA控制台时出现乱码这个坑比较隐蔽。根因在于IDEA的默认文件编码方式与Windows控制台默认编码不一致。建议在File——Settings——Editor——File Encodings中把Global Encoding、Project Encoding、Default encoding for properties files都换成UTF-8同时在Help——Edit Custom VM Options中添加一行-Dfile.encodingUTF-8改完重启IDEA。这个操作把整个IDE运行环境的默认编码统一为UTF-8基本能一次性解决乱码问题。6.5 sbt首次运行卡在“Loading project definition”如果你选择了sbt模板创建项目后右下角一直显示sbt在加载项目定义进度条长时间不动通过菜单栏的“sbt shell”能看到日志卡在依赖解析阶段一般就是远程仓库访问不了。推荐用5.4节说的阿里云镜像方案解决。对国内的开发者来说这一步配置的价值比任何一个步骤都大它能避免你后续每一秒都浪费在无谓的等待上。6.6 常见问题速查表问题现象核心原因解决思路命令行scala -version无输出SCALA_HOME或Path配置错误检查环境变量重开终端确认路径完整IDEA找不到Scala SDK配置环境变量前已启动IDEA完整退出并重启IDEA或手动Browse定位新建项目无Scala选项IDEA未安装插件进入Marketplace安装Scala插件并重启编译报错constant type异常JDK版本过新将项目SDK切换为JDK 8控制台中文乱码编码配置不一致统一设置为UTF-8并添加VM参数sbt加载缓慢卡住Maven仓库访问受限配置阿里云镜像源7. 扩展建议与实际使用心得7.1 搭建完成后建议先练习什么跑通HelloWorld只是第一步我建议接下来花两天时间做三件事能把环境真正变成肌肉记忆。第一件事是练习Scala的集合操作因为这是和Java差异最大、也最能体现Scala优势的地方。比如随便定义一组数字用map、filter、reduce组合完成一个统计任务比如计算一百以内偶数的平方和。这段代码写出来你对Scala的集合类顶层设计、函数式写法会有一个直观认识。第二件事是试着写一个简单的文件读写脚本。Scala相比Java在文件处理的语法上简洁很多这个练习能让你体会到Java和Scala在操作同一个JVM资源时的不同体验。第三件事就是正儿八经创建一个sbt项目引入一个第三方依赖。以spark-core为例在build.sbt中加入libraryDependencies org.apache.spark %% spark-core % 3.2.0保存后sbt会自动去下载相关jar包。这个过程非常考验网络和依赖解析能力。把这一步跑通你后续学Spark就基本不会卡在环境上了。7.2 后续升级版本时要保持的警惕心以后你可能会想升级到Scala 2.13乃至Scala 3这个方向我支持但要留意一下版本跳变带来的兼容性变化。比较典型的变化有2.13开始集合框架被重新设计很多原有的隐式转换API发生了变动Scala 3则是一次更大的整体变化。如果你的项目框架尤其是Spark版本不支持强行升级Scala版本可能导致框架内部反射调用的代码直接编译失败最终结果是花大量时间修改别人的库代码得不偿失。我在工作中的一个原则是能不动则不轻易动版本组合动版本之前先查该框架官方文档里的兼容性矩阵。知道这个组合是不是经过官方测试的再决定升级计划。7.3 要不要直接学sbt或Maven很多Scala新手会问既然IDEA里可以直接运行Scala代码为什么还要学sbt。这个问题的答案是IDE的运行按钮本质上是帮你调用了编译器并启动JVM而真实工程里的依赖管理、多模块拆分、测试运行、打包发布都需要一套完整的构建工具来支撑。sbt确实学习曲线比Maven陡一些但胜在Scala生态原生支持好。我的建议是先从sbt的常用命令compile、run、test、package开始不要一开始就追求配置深度先会跑再慢慢理解原理。如果你未来主要做Java后端不太接触大数据生态那也可以直接用Maven管理Scala项目。IDEA对Maven项目的Scala支持也做得不错只需要在pom.xml里加入scala-maven-plugin构建流程就和纯Java项目没什么区别。两种方案我都在不同项目里用过不存在谁绝对更优关键看你的团队和项目背景。7.4 环境备份与迁移技巧环境搭建好了最怕的是换电脑或者系统重装。这里分享一个我的备份习惯将Scala SDK的整个目录压缩备份一份IDEA的配置可以导出sbt的依赖库默认在用户目录下的.ivy2和.sbt目录把这三个目录备份一下换新机器时直接解压并配置环境变量就能在几分钟内恢复一套完整可用的开发环境。具体操作是在公司电脑上执行jar -cf scala-env-backup.tar ~/dev/scala-2.12.15 ~/.ivy2 ~/.sbt新机器上解压后只需设置SCALA_HOME和PATH指向解压后的目录不用重新去下载Scala发行版也不用重新拉取依赖库省下的时间非常可观。7.5 最后的小补充最后说一个很多人没注意到的小细节。Scala命令默认打开的是一个REPL交互式环境也就是输入一行执行一行很适合快速验证语法。但有部分初学者以为scala命令就是运行脚本其实如果你在终端输入scala不带任何参数看到的是一个scala提示符这时候粘贴代码按回车就能执行。这个REPL模式在我调试小片段代码时帮了不少忙不需要建项目不需要写完整类比IDE里跑一遍要高效率很多。环境搭好之后可以多试试这个入口在交互中感受Scala表达式的计算逻辑和写完整程序完全是两种体验。从整体来看Scala的环境搭建并没有特别复杂真正的核心挑战在于版本之间的匹配关系以及构建工具对仓库的访问速度。只要把版本选型、插件的安装、sbt的镜像配置这几个节点把控住后面的使用流程就会非常顺畅。我把自己配置环境的真实流程、过程中遇到的问题以及解决办法都写在这里了希望能帮你少走一些弯路。如果你按照这个流程搭完发现还有哪里对不上号的大概率就是某个配置细节被忽略了按表格一步步排查就能找到原因。