Mac上安装Scala开发环境:从JDK到IDEA完整教程
1. 前言为什么单独写一篇Mac装Scala的教程写这篇东西的起因很简单——Scala的开发环境搭建官方文档写得不算差但Mac用户照着走一遍十个有八个要卡在某个环节出不来了。不是JDK版本和Scala版本对不上就是brew装到一半报权限错误要么是IDEA插件搜不出Scala折腾一晚上连个Hello World都跑不起来。我早期带过不少用Mac做数据开发的朋友坦白讲环境问题劝退的人比语言本身难倒的人还多。Scala作为一门兼顾面向对象和函数式编程的语言JVM生态兼容性好在大数据领域Spark、Kafka、Flink的底层都是主力语言但如果开发环境就拦了一道坎后续的学习动力肯定受影响。这篇教程我按完整流程来写从JDK安装、Scala安装方式对比到IDEA里的插件配置和第一个项目的创建最后附上我踩过的坑和排查方法。不管是完全零基础的新手还是已经装了部分环境、卡在中间步骤的开发者照着走都能折腾明白。需要提前说明的是本文不涉及任何破解、激活相关的操作IDEA请使用官方正版社区版完全足够学习Scala使用。激活码、破解脚本这些东西本身就是灰色地带容易带入恶意代码别因小失大。2. 安装前的环境检查与准备2.1 确认Mac处理器架构Apple Silicon还是Intel这是很多Mac新手最容易被忽略的一步。因为Apple SiliconM1、M2、M3等芯片和Intel芯片的Mac虽然大部分软件安装方式一样但个别组件、SDK版本、终端命令工具可能存在差异尤其是涉及到原生编译的组件架构选错了装不上很常见。查看方法很简单左上角苹果图标 - 关于本机如果显示Apple M1 Pro、Apple M2这类字样就是Apple Silicon如果显示Intel Core i5或Intel Core i7就是Intel架构。还有个命令方式打开终端输入uname -m输出arm64就是Apple Silicon芯片输出x86_64就是Intel芯片。别小看这个信息后面你可能会去官网下载Scala或JDK的安装包选错架构版本就白下。2.2 安装JDK并验证版本Scala运行在JVM上所以JDK是必须的前置条件。你可以理解为Scala写出来的代码最终要编译成字节码交给Java虚拟机执行没有JDKScala就是无源之水跑不起来。JDK的安装方式我梳理下来主要有两种选一个适合自己的就行Oracle JDK也可选择OpenJDK分支Oracle官网下载版本稳定企业用得最多但下载时可能需要点几个确认页面。Homebrew安装OpenJDK命令一条搞定后续升级也方便适合喜欢用包管理的开发者只是如果你还没装brew得先去装brew。我个人推荐用Homebrew装原因很简单——后续装Scala同样要用brew一次搞定包管理器后面省心很多。如果你还没装Homebrew官网有安装命令终端里执行即可我建议装完顺手跑一下brew doctor检查配置是否有问题。比如安装JDK 17目前比较主流的长期支持版本Scala 2.13和Scala 3都用得很稳brew install openjdk17装完以后Homebrew可能会提示你JDK的路径在/usr/local/opt/openjdk17Intel或/opt/homebrew/opt/openjdk17Apple Silicon但因为macOS自带的/usr/bin/java是系统旧版本你还需要手动配置环境变量让系统找到新装的JDK。先验证一下java -version如果显示的不是17而是Java 8或者直接提示找不到就需要配置一下路径。打开终端配置文件open -e ~/.zshrc加上这段export JAVA_HOME/opt/homebrew/opt/openjdk17 export PATH$JAVA_HOME/bin:$PATH如果是Intel芯片的Mac/opt/homebrew要换成/usr/local别搞混了。保存后执行source ~/.zshrc再验证java -version正常会显示openjdk version 17.x.x之类的信息。到这里Java环境就绪。注意如果你电脑上已经装有其他版本的JDK且不是你想要的版本建议优先考虑用SDKMAN这样的工具目录来管理JDK版本。我个人早期不知道SDKMAN结果不同项目要求JDK 8、11、17来回切换手动改环境变量改到崩溃。SDKMAN是JVM生态非常成熟的多版本管理工具一条命令完成安装、切换、卸载强烈建议做Java/Scala开发的都装一个。2.3 检查终端与Shell环境macOS从Catalina10.15开始默认Shell已经改成了zsh不再是老版本的bash。这意味着你配置环境变量时要改的文件是~/.zshrc而不是~/.bash_profile。身边用bash配置完环境变量死活不生效的朋友基本都是没意识到这个变化。确认当前Shellecho $SHELL正常会输出/bin/zsh。如果你的输出是/bin/bash也不用慌可以在终端偏好设置里把默认Shell切换为zsh或者仍然使用bash对应的配置文件~/.bash_profile后续操作对应调整即可。3. Scala安装方式详细对比与实操Scala在Mac上有好几种安装方式但我实际用下来值得推荐的就三种Homebrew、官方包手动安装、SDKMAN。下面逐一拆解。3.1 方式一Homebrew安装最推荐、最省心前提是你已经有Homebrew环境。安装命令极其简单brew install scala喝口水的功夫就装好了。Homebrew会自己处理Scala与JDK的依赖关系比如你本机没有合适的JDK它很可能自动帮你拉一个依赖进来。装完以后检查是否成功scala -version which scala scalac -versionscala -version看到的是执行脚本/REPL环境scala命令的版本scalac -version是Scala编译器的版本两者应显示一致比如Scala code runner version 2.13.x、Scala compiler version 2.13.x。如果系统找不到scala命令大概率是~/.zshrc里没有加PATH。Homebrew默认会把可执行文件链接到/opt/homebrew/binApple Silicon或/usr/local/binIntel先确认这个目录在你的PATH里echo $PATH如果没有同样是在~/.zshrc里补充export PATH/opt/homebrew/bin:$PATH3.2 方式二官方包手动安装如果你不想装Homebrew或者公司电脑对包管理器有管控也可以用官方发布的二进制包。访问Scala官网的下载页面找到对应版本的压缩包下载解压后把bin目录加入PATH即可。这种方式的问题在于解压出来的文件路径比较乱而且后续升级版本要手动重新下载覆盖。不建议新手用这种方式除非你对目录规划、PATH配置已经非常熟悉否则容易把系统环境变量搞得乱七八糟。3.3 方式三SDKMAN安装多版本切换神器如果你做Scala开发不是一次性学习而是准备长期维护多个项目那SDKMAN是比直接brew install更优雅的方案。先装SDKMANcurl -s https://get.sdkman.io | bash装完source一下source $HOME/.sdkman/bin/sdkman-init.sh然后安装Scala指定版本比如2.13.xsdk install scala 2.13.12或者直接装默认版本sdk install scala切换版本时一条命令sdk use scala 2.12.18这个方法的好处是Scala 2和Scala 3的大版本语法有差异而你手上的老项目可能跑在2.12新项目用3.x随时切换互不干扰。我强烈建议有多个项目需求的开发者优先考虑SDKMAN。3.4 三种方式选型总结安装方式适用人群优点缺点Homebrew大多数开发者命令简单、依赖自动处理版本更新可能延迟官方手动包对包管理器有管控的场景官方原版、版本明确升级麻烦、路径易混乱SDKMAN多版本切换的重度用户版本切换灵活、管理集中需要额外安装SDKMAN经验提示不管用哪种方式装完第一件事就是跑scala -version和scalac -version看版本是否一致。不一致的后果是你后续用scala命令能进交互式环境但scalac编译文件时会报一些奇怪的“bad option”或“unsupported class file major version”错误。3.5 验证Scala是否安装成功完成安装后写个简单栗子验证一下。创建hello.scalaobject Hello extends App { println(Hello, Scala on Mac!) }编译并运行scalac hello.scala scala Hello如果输出Hello, Scala on Mac!说明Scala环境完全可用。这一步还有个隐藏验证点scalac能正常编译说明JDK和Scala编译器兼容性没问题。只用scala命令也能验证直接进入REPLscala输入println(test)回车能输出结果就OK输入:quit退出。4. IDEA安装与Scala插件配置4.1 安装IntelliJ IDEAScala开发我首选IntelliJ IDEA这几乎是JVM生态开发者的共识。IDEA分两个版本终极版Ultimate和社区版Community。就Scala学习、Spark开发、中型项目来说社区版完全够用免费且开源对Scala有很好的支持。所以如果你还在纠结装哪个版本我的答案很清楚学习阶段用社区版不要有“终极版才配写代码”的错觉Scala插件在社区版上照常能用唯一限制的是一些企业级框架的集成功能比如部分Java EE支持Scala开发影响不大。官网下载对应的.dmg安装包双击拖入Applications目录即可。如果你用brew也是可以的brew install --cask intellij-idea-ce我在实际使用中觉得官网下载和brew安装都一样看你对包管理器的依赖习惯。IDEA第一次启动会问你要不要导入旧版本配置新装的话直接选Do not import settings。4.2 IDEA安装Scala插件重点中的重点IDEA默认是不带Scala插件支持的你需要手动安装。打开IDEA后依次点击IntelliJ IDEA-Settings快捷键Cmd ,-Plugins-Marketplace标签页在搜索框输入Scala会看到一个由JetBrains官方出品的Scala插件注意看清楚插件名就叫Scala不要装那些第三方的。点击Install安装装好后IDEA会提示重启重启后插件生效。这里说几个我见过的坑**坑一插件市场里搜不到Scala。**这种情况大多数是因为IDEA的插件源访问不稳定或者公司网络做了限制。解决方案是手动下载插件包然后通过Install Plugin from Disk...安装。去JetBrains插件官网下载对应版本的zip包在IDEA的Plugins设置页找到齿轮图标选Install Plugin from Disk...选中本地zip包即可。**坑二装了插件但新建项目时没有Scala选项。**这种情况要先确认IDEA版本和Scala插件版本是否兼容。比如IDEA 2023.2之后的版本老版本的Scala插件可能装不上或装完没效果。另外插件安装后必须重启IDEA且重启后要确保插件在Plugins列表里显示为Enabled状态。**坑三插件显示的Scala版本和你实际安装的Scala版本对不上。**IDEA的Scala插件本身只是一个语言支持层它不负责打包Scala编译器。你在IDEA里选Scala SDK时它会让你指定一个本地Scala安装路径一般指向你的brew安装目录或者让你直接下载一个Scala版本。这里如果选错了项目编译时会报各种class not found之类的错误。4.3 配置SDK与全局库这里有个很重要的细节IDEA里面配置Scala SDK其实有两种理解方式。一种是全局库Global Libraries配置一次所有项目都能用另一种是每个Project Structure里单独配置独立于具体项目的module。我个人建议配置全局库因为Scala SDK的本地路径是固定的设置一次后面所有Scala项目都能自动识别不用每个新项目都折腾一遍。操作路径Settings-Languages Frameworks-Scala或直接右键Project StructureCmd ;-Global Libraries- 点击加号 -Scala SDK-Browse...选择本地Scala安装目录。选对路径后IDEA会自动识别版本号。你要是找不到安装路径可以回到终端用which scala查一下然后顺着路径找到Scala的lib目录位置即可。5. 在IDEA中创建并运行第一个Scala项目5.1 新建项目时的两个关键选项插件配置好后新建Scala项目就顺畅多了。File-New-Project左侧选择Scala右侧选择IDEA这是最简单的项目形式不依赖sbt或maven直接把源码交给IDEA编译运行。然后关键点来了在Project SDK那里选择你本地安装的JDK前面已经配好了JDK 17在Scala SDK那里选择本地Scala版本。我看到不少新手卡在这一步原因很简单——Scala SDK下拉框是空的没有可用选项。这时候点右侧的Create...或Browse...按钮版本不同按钮文字可能不同手动选中Scala安装根目录让IDEA自行加载。我再次强调这里的路径要指向Scala安装的根目录或者lib目录比如/opt/homebrew/Cellar/scala/2.13.12不要选到bin子目录去否则识别不出来。5.2 项目结构说明项目创建好之后你会看到IDEA自动生成了一个典型的Scala项目目录结构src目录源码目录里面只有项目名这个包名.idea目录IDEA的配置目录存放项目级配置项目名.iml文件模块描述文件可以理解为IDEA的项目元数据。虽然IDEA的Scala项目不像Maven项目那样要求严格的src/main/scala约定结构但我还是建议在src目录下按main/scala的层级创建包和源码文件保持习惯上的目录规范后续如果要迁移到Maven或sbt工程目录调整成本最低。5.3 编写并运行Hello World在src上右键 -New-Scala Class类型选Object起名HelloWorld。IDEA会自动生成代码你只需要在object里补上一个main方法object HelloWorld { def main(args: Array[String]): Unit { println(Hello, World from Scala on IDEA!) } }然后右键类名选Run HelloWorld。控制台输出Hello, World from Scala on IDEA!那一刻你的Mac上Scala开发环境就彻底搞定了。写到这里我想多啰嗦两句如果你以前只写过Java第一次写Scala的def main可能会觉得奇怪——它在object单例对象里定义而不是在类里定义静态方法。这是Scala设计上的差异因为Scala没有静态成员的概念object就是用来替代Java静态方法的机制。5.4 配置sbt项目进阶必看我们刚才创建的是IDEA简易项目适合写一两个测试文件、学习语法用。如果你做的是真实的Scala工程几乎一定会遇到sbtScala Build Tool项目的构建和依赖管理。IDEA的New Project里也有sbt选项建sbt项目的好处是依赖管理、多模块构建、持续集成都标准化了。选sbt类型后有几个参数窗口JDK版本同上选择本地JDK版本sbt版本默认一般即可如果有特殊需求可以改Scala版本填写或选择你需要的版本。sbt项目创建后IDEA会自动下载sbt依赖这个过程在国内网络环境可能比较慢卡上几分钟甚至失败都很正常。如果长时间卡在sbt下载依赖上我的建议是检查网络必要时可通过代理方式加速但要注意合规性开启sbt的国内镜像仓库在~/.sbt/repositories或项目的build.sbt里配置一个mirror仓库地址这是规范的开发配置操作不影响安全实在不行先在终端验证一下scala -version正常再去IDEA里刷新sbt项目依赖下载失败往往是临时性问题。6. 常见问题速查与排查经验6.1 终端报错“command not found: scala”这种情况最直接的原因是Scala确实没装上或者装上了但PATH里没有。排查步骤which scala echo $PATH ls /opt/homebrew/bin/scala如果/opt/homebrew/bin/scala存在但which找不到检查/opt/homebrew/bin是否在PATH中如果文件都不存在就回到第3节重新装一次。6.2 Homebrew安装报错或卡住经常遇到两类错误一类是网络超时一类是权限问题。网络超时的表现是curl下载卡住不动报Failed to connect或Operation timed out。权限问题的表现是Permission denied dir_s_mkdir或cannot write to /usr/local。权限问题的处理方法是确保当前用户对Homebrew目录有写权限或者用目录属主身份执行安装sudo chown -R $(whoami) /opt/homebrew也可以直接用sudo brew install scala但这个操作本身不是推荐的因为brew官方建议避免使用sudo。6.3 IDEA插件已安装但新建项目没有Scala选项如果你确认插件已经装好且已启用但New Project左侧依然看不到Scala先重启IDEA再试一次。如果重启还不行检查项目类型是否正确新建项目时要选的是New Project而不是New Module虽然Module也可以但入口不一样容易混淆。这听起来像是个低级错误但IDEA的术语体系对新手来说并不是那么直观我见过好几个人在这里卡住。6.4 编译报错“Bad option”或“unsupported class file major”这类问题几乎都是Scala编译器和JDK版本不匹配导致的。Scala 2.12以下版本配JDK 17高概率会报unsupported class file major version 61之类的问题因为JDK 17的字节码版本对老编译器而言超出了支持的版本范围。解决办法很简单要么把JDK降级到8或11要么把Scala升级到2.13以上的版本。这也是我为什么在开头建议直接装JDK 17的原因——目前主流的Scala版本2.13.x、3.x在JDK 17上运行都很稳定。6.5 sbt下载依赖慢或者失败sbt本身的启动、依赖下载慢是Scala开发者绕不开的痛点。除了搭建镜像源等常规手段外还有个很小的技巧给sbt加大JVM内存在~/.sbtconfig或~/.sbt/sbtopts里加上-J-Xmx2G内存不足也是sbt崩溃的常见原因之一。6.6 常见问题速查表问题现象可能原因解决方案scala命令找不到PATH未配置或未安装检查安装目录并配置PATHJava版本与Scala不兼容JDK过新或过旧升级Scala或降级JDKIDEA插件市场无法访问网络受限手动下载插件zip安装New Project无Scala选项插件未生效或IDEA缓存异常重启IDEA或清理并重建项目sbt卡在依赖下载网络问题或仓库配置配置镜像仓库加大内存项目编译时IDEA报Scala SDK错误全局库指向错误或路径失效在Project Structure中重新配置SDK7. 我的一些个人经验补充最后聊几个不容易写进教程正文、但实际使用频率极高的细节。**第一个是“多版本并存”的思路。**如果你手头既有老的Spark项目锁死Scala 2.11/2.12又要写新代码尝试Scala 3终端里切版本、IDEA里切SDK很容易把自己搞晕。我的管理习惯是终端环境用SDKMAN做版本切换IDEA的每个项目独立使用Project SDK配置而不只依赖全局库这样项目之间彻底隔离互不影响。**第二个是养成用scalac编译完整文件的习惯别老是REPL里跑一行两行。**写玩具代码确实REPL方便但真实开发中函数签名、类型推导、隐式转换这些问题只有在编译整个文件时才会暴露REPL里跑得通不代表编译能过。我在教学过程中看到的编译错误十有八九是新手不习惯Scala严格的类型推导导致的。**第三个是IDEA的Scala插件自动补全和类型提示确实是效率利器但一开始不要过度依赖。**建议前几周练习时先自己在脑子里推断类型再让IDEA给你正确答案。Scala这门语言类型系统是精髓如果从一开始就只靠IDE提示很难建立类型思维。**第四个是善用sbt构建工具。**很多Scala新手一直在用IDEA的内置编译明明已经在写完整项目了却从不碰sbt。等到需要打包部署或者引入第三方依赖时才开始手忙脚乱。我的建议是从第二个Scala项目开始就直接用sbt构建最好在终端里先熟悉sbt compile、sbt run、sbt clean这几个基础任务再回到IDEA里愉快开发。毕竟IDEA只是个编辑器构建工具才是项目的根基。我待过好几个团队凡是Scala上手快的人基本都是前期把环境折腾明白了、构建体系也摸透了的。环境配置这东西就像地基——你第一批代码写得丑没关系基础工事没做好后面每走一步都会踩坑。希望这篇教程能帮你顺利跨过第一道坎省下那些重复排查的夜晚。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →