
在Windows上装Scala听起来就是下载、解压、配环境变量三步但我在很多技术群里见过最多的求助截图恰恰是卡在这三步上的scala 不是内部或外部命令、Error: could not find java、配完环境变量重启终端还是没用。这篇文章就是彻底解决这些问题的完整流程笔记。我会从JDK准备开始一直讲到Scala本体安装、环境变量配置、REPL验证再到sbt和IDE组合所有步骤都按Windows系统上的实际操作来讲。内容适合第一次接触Scala的新手也适合装了好几次没成功、想一次搞明白的开发者。1. 装Scala最常见的三个翻车现场先认清问题再动手1.1 只装Scala不装JDK一运行就报缺JavaScala不是独立于Java生态之外的编程语言它和Java一样跑在JVM上。编译器把Scala源码编译成JVM字节码运行的时候依然需要Java运行时环境。很多人下载Scala安装包时装得很顺利结果在命令行敲一个scala立刻弹出类似java not found或者找不到Java运行时的提示然后整个人就懵了。原因就在于只装了Scala本身没有先装JDK。这里的JDK是Java开发工具包不是JRE运行环境。光有JRE也不够因为Scala编译器需要JDK里的工具链来配合工作后面用sbt构建项目时对JDK的依赖更明显。所以安装Scala之前第一件事永远是确认这台Windows机器上有没有可用的JDK而且版本要合格。1.2 版本随便选导致项目跑不起来第二个很常见的翻车现场是安装Scala时直接挑下载页面里最新的版本完全不管自己手头项目的情况。Scala目前主要分成2.13和3.x两条大版本线很多老项目还停留在2.12或2.13。语法、标准库、第三方依赖的兼容性在不同版本之间差别挺大下载一个最新的Scala 3版本去跑2.12时代的老代码常常会出现一堆莫名其妙的编译错误。另外还有JDK版本和Scala版本之间的匹配问题。安装了太老的JDK 8再去跑需要JDK 11以上特性才能编译的Scala 3一样会失败。我在实际帮人排查时经常看到机器上装了两三个JDK版本PATH里的顺序又不对结果java -version看到的是一个版本Scala实际用的又是另一个版本这种错位是最难排查的。1.3 下载了源码包或压缩包却不知道要手动配置还有不少人下载Scala时没有看清楚文件类型。Scala官网下载页里同时提供.msi安装包、.zip压缩包还有源码包。新手最容易踩的坑就是把源码包当成品下载下来解压后根本没有可执行文件或者下载了.zip压缩包解压后以为装完了结果命令行里依然找不到scala命令。zip包属于绿色版需要手动解压到目标目录然后自己配置环境变量才能用。msi安装包虽然会自动做很多事但也未必会把环境变量全部设置到位尤其是SCALA_HOME这种系统变量常常不会自动写入。接下来的几个章节我按顺序把每一条路线都拆开讲。2. 安装前的关键准备JDK版本、发行版和安装路径怎么选2.1 为什么Scala离不开JDK编译器与运行时的关系用一句话总结Scala代码最终要变成JVM字节码而字节码的编译和运行都需要Java平台支持。JRE只负责运行已经编译好的字节码JDK则包含了完整的开发工具链包括javac编译器、jar打包工具还有下一节要讲的sbt构建工具运行时所需要的标准库。如果还是不太理解可以把这个关系类比成做菜JDK是厨房里的整套锅具和刀具JRE只是其中一个燃气灶Scala是菜谱sbt是帮工。没有锅具你连原料都处理不了光有燃气灶只能热剩菜。所以安装Scala的正确顺序永远是装JDK再装Scala最后才是sbt。顺序颠倒就会遇到各种奇怪问题。2.2 版本选择和验证命令别拿旧项目去踩新版本JDK版本不仅是越新越好还要看项目兼容性。我整理了一张常见选择表直接照着选就行使用场景推荐JDK版本说明Scala 2.13维护旧项目JDK 8 或 JDK 11兼容老代码稳定性优先Scala 3新项目JDK 11 或 JDK 17JDK 17是LTS综合表现最稳想尝试新语法/JDK新特性JDK 21注意个别老库可能没跟上日常学习REPL和小脚本JDK 11足够用安装包也更轻选好版本之后在命令行先做一次体检。打开cmd或PowerShell依次执行java -version javac -version echo $env:JAVA_HOMEjava -version输出的是运行时版本javac -version输出的是JDK编译器版本。如果第二条命令报错说明你装的是JRE而不是JDK或者JDK没有正确配置。JAVA_HOME环境变量在后面的sbt环节尤为重要sbt启动时会优先找它没设置的话会出现找不到Java的提示。2.3 发行版选择和安装路径的经验现在Windows端可用的JDK发行版不少核心都是OpenJDK。对个人开发者来说选一个有长期支持保障的OpenJDK发行版就行不需要纠结太多。我的建议是优先认准LTS版本因为工具链、Scala编译器、第三方库都对LTS版本测试最充分。安装JDK时还有两个容易忽略的细节。第一路径不要带空格和中文比如D:\jdk\jdk-17这种就比C:\Program Files\Java\jdk-17省心。虽然现代工具大多能处理带空格的路径但部分脚本、旧版sbt在解析时还是会出问题。第二装完之后重新打开一个终端窗口让环境变量的改动生效然后再做一次java -version确认。另外建议记录一下JDK的安装位置后面的JAVA_HOME要用到。如果是安装包默认装的一般在C:\Program Files\Java\jdk-后面带版本号如果自己解压的OpenJDK就记住解压目录。不要凭记忆敲路径用一次where java看看实际的可执行文件在哪更可靠。3. 官方渠道安装Scala本体msi自动配置和zip手动配置两条路线3.1 路线一msi安装包适合绝大多数人访问Scala官网的下载页面找到当前推荐版本选后缀为.msi的Windows安装包。这个文件是官方打包的图形界面安装器双击之后几乎全程下一步就能完成。msi安装完成后默认会把Scala的bin目录写入系统PATH环境变量所以大多数情况下你重新开一个命令行窗口直接输入scala -version就能看到版本号。但有两个问题需要手动确认第一SCALA_HOME这个变量通常不会自动创建后面某些工具会用到建议手动补上第二如果这台机器之前已经装过旧版ScalaPATH里可能存在多个版本条目需要检查顺序。安装过程中我遇到过一些安全软件拦截msi写入PATH的情况导致安装成功但命令不识别。所以装完不要急着关窗口花半分钟手动确认一下PATH里有没有Scala相关条目这一步能省掉后面大量排查时间。3.2 路线二zip压缩包适合想掌控安装细节的人如果你喜欢绿色软件或者之前安装过旧版本不想被msi覆盖zip方式更合适。下载页面里选择.zip压缩包解压到一个固定目录比如D:\scala\scala-2.13.12。解压后先看一眼目录结构正常情况下能看到bin、lib、doc这几个文件夹bin下面有scala.bat、scalac.bat、scala.bat等Windows批处理文件。确认无误后先把路径记下来下一步配置环境变量时要用。我的建议是即便你打算用zip方式也尽量把Scala目录放在固定、简洁、无中文无空格的路径下比如D:\scala\scala-2.13.12。不要今天解压在桌面明天又挪到某个临时目录后面配环境变量时路径一改命令就找不到了。zip方式不会自动写入任何环境变量所以环境的配置任务比msi方式多一点。好处是可控——你知道自己的Scala到底装在哪里PATH里有哪些条目出现问题时容易排查。3.3 关于安装目录命名和文件校验的提醒前面反复提路径不要有空格和中文这里解释一下原因Windows上的批处理脚本在解析路径时对空格的处理方式不够一致。Scala自带的启动脚本本身能应对C:\Program Files这种路径但当你搭配sbt、IDE、各种CI工具时空格路径经常成为变量解析的隐性障碍。直接避开没有坏处。另外下载完成后最好做一个简单的完整性检查。官网下载页通常会提供文件的校验值如果你不确定下载过程是否被干扰可以查一下压缩包的哈希。Windows系统自带Get-FileHash命令Get-FileHash D:\Download\scala-2.13.12.zip -Algorithm SHA256把输出的哈希值和官网公布的比对一致再解压。这一步不是必须的但在网络环境不太稳定时值得做避免解压到一半发现某个文件损坏导致Scala运行报出ClassNotFoundException这类奇怪错误。4. 环境变量配置拆解SCALA_HOME、PATH和命令不识别的真相4.1 SCALA_HOME和PATH各负责什么很多教程只说把Scala配到环境变量但没讲清楚为什么要配两个。PATH是操作系统搜索可执行文件的目录列表。当你在命令行输入scala时系统会按顺序在PATH列出的目录里找scala.bat或scala.exe。所以PATH是给命令行的scala、scalac用的。SCALA_HOME则是一个自定义的环境变量指向Scala的安装根目录。这个变量本身不影响命令行命令的查找但它对sbt、IDE、以及很多第三方构建脚本很重要。这些工具启动时会读取SCALA_HOME用它来定位Scala标准库和编译器组件。所以标准做法是两者都配SCALA_HOME指向D:\scala\scala-2.13.12PATH里添加一行%SCALA_HOME%\bin。用变量而不是写死路径好处是以后升级Scala版本时只需改SCALA_HOME这一个值PATH里的引用自动跟着变。4.2 图形界面配置步骤图形界面配置是最稳的方式适合所有Windows用户步骤如下按Win R输入sysdm.cpl回车打开系统属性。切到高级选项卡点环境变量。在系统变量区域点新建变量名填SCALA_HOME变量值填Scala的解压目录比如D:\scala\scala-2.13.12确定。在系统变量列表里找到Path双击编辑点新建添加一行%SCALA_HOME%\bin确定。所有窗口点确定关闭。之后重新打开一个cmd窗口输入scala -version验证。这里有个建议环境变量分为用户变量和系统变量。个人电脑配系统变量没问题但如果是公司电脑系统变量的修改可能需要管理员权限如果只是自己用配到用户变量也完全可以。只是要注意用户变量的PATH和系统变量的PATH是叠加生效的具体搜索顺序是先系统变量后用户变量别把两处搞混了。4.3 setx命令配置和它的坑命令行也可以用setx配置但我明确不建议用它来改PATH。原因有两条第一setx写入环境变量时把当前值整体覆盖如果你PATH里已经有很多内容它会展开变量并重新写入很容易把原本的变量结构弄乱第二Windows的环境变量写入有长度限制超长截断是真实存在的风险。很多时候用户配完setx PATH后发现连java命令都不见了就是因为PATH被截断或错误展开。如果你还是想用命令行配置SCALA_HOME这条相对安全setx SCALA_HOME D:\scala\scala-2.13.12PATH的改动我还是建议回到图形界面手动加一行。尤其对不熟悉命令行的新手图形界面所见即所得出问题也容易还原。4.4 为什么配好了还是提示不是内部或外部命令终端会话的刷新机制这是被问得最多的问题明明PATH看了、SCALA_HOME也加了新开的cmd窗口还是找不到scala。真相是命令行窗口的环境变量是在进程启动时读取的。如果配环境变量之前就已经开着一个cmd/PowerShell窗口这个窗口不会自动刷新PATH它只知道启动那一刻的环境。你必须完整关闭再重新打开一个终端窗口环境变量才会加载。PowerShell里有一个临时刷新的办法不用关窗口$env:Path [System.Environment]::GetEnvironmentVariable(Path,Machine) ; [System.Environment]::GetEnvironmentVariable(Path,User)这条命令把当前会话的PATH重新读取一遍之后scala -version大概率就能识别。但它只对当前窗口生效新开窗口依然会正常读取系统配置。所以最保险的流程还是改完环境变量把所有终端窗口全部关掉重新打开一个干净的窗口进行验证。5. 验证安装并跑通第一个程序scala命令没你想的那么简单5.1 三个命令确认安装状态环境变量配好之后用三个命令做体检java -version scala -version scalac -versionjava -version确保JDK可用scala -version输出的是Scala运行时版本scalac -version检查编译器版本它和运行时版本不一致的话说明PATH里混入了不同版本的Scala路径。如果scala -version正常但scalac -version找不到多半是PATH里只配置了运行脚本缺少编译器脚本或者安装的是阉割版/绿色版。标准压缩包里两个命令一定都有msi安装也一样。5.2 REPL验证最强的快速上手工具确认版本后先别急着写代码文件用REPL做一次最快验证。在命令行输入scala回车会进入交互式解释器。直接输入表达式1 2屏幕上立刻输出res0: Int 3。再输入println(Hello, Scala!)输出Hello, Scala!后输入:quit退出。REPL能跑通说明Scala运行时、标准库、启动脚本全都正常工作。REPL的英文全称是Read-Eval-Print Loop读取、执行、打印、循环。它的价值不只是安装验证日常写代码时想试一个语法、验证一个API行为打开REPL比开IDE建项目快得多。我自己的习惯是安装完Scala先用REPL玩半小时把基本语法跑一遍顺便感受版本特性比直接上手项目更容易建立信心。5.3 用scalac编译并运行一个独立文件REPL验证的是运行时接下来用编译器走一遍完整流程。新建一个文本文件Hello.scala写入object Hello { def main(args: Array[String]): Unit { println(Hello, Scala!) } }回到命令行执行scalac Hello.scala scala Hello如果一切正常屏幕上会输出Hello, Scala!。这个过程里scalac把.scala源码编译成.class字节码文件scala命令负责启动JVM并运行编译后的主类。你会在目录下看到Hello.class、Hello$.class等文件不要手动删它们后续sbt构建也会有类似的编译产物。顺便说一个容易混淆的点scala命令既能启动REPL也能运行编译后的类scalac只是编译器不负责运行。很多新手以为scala Hello.scala可以直接编译并运行源码文件但Scala 2默认不支持这种方式Scala 3的scala命令有所变化。习惯上还是先scalac编译再scala运行思路最清晰。5.4 命令找不到、版本对不上的快速排查表如果按上面的流程验证失败直接对照表格排查现象可能原因解决方案scala不是内部或外部命令PATH缺少bin目录检查%SCALA_HOME%\bin是否在PATH里scala提示找不到JavaJDK未安装或JAVA_HOME未设置安装JDK设置JAVA_HOMEscala -version和scalac -version版本不一致PATH里有多个Scala的bin目录用where scala和where scalac找到实际路径清理多余条目新开终端仍然找不到命令终端没有完全重启全部关闭终端重新打开执行文件弹出安全提示安全软件拦截脚本检查安全软件隔离区添加信任目录where scala这个命令在Windows上非常有用它会把PATH里所有匹配的可执行文件路径列出来从上到下就是实际解析顺序。如果列出来两个不同版本的Scala路径高位的会先被执行这就是版本对不上的根源。6. 从命令到项目sbt构建工具和IDE组合的实战配置6.1 sbt的安装和内存参数调整命令行能跑Scala只是第一步实际做项目还得靠sbt。sbt是Scala社区最常用的构建工具下载zip压缩包后解压并确保解压目录的bin路径也加入PATH。然后重新开终端验证sbt --versionsbt第一次启动时会下载大量依赖速度可能很慢这是正常现象。如果公司网络或校园网访问默认仓库不理想可以在用户目录下创建.sbt文件夹里面放一个repositories文件把默认的Maven中央仓库地址替换成网络环境里访问更快的镜像地址。注意这里的方式是替换仓库地址不是绕过什么限制纯粹是网络优化手段。sbt默认堆内存可能偏小项目稍大一些就频繁GC。如果你发现构建时内存吃紧可以在sbt安装目录的conf文件夹下找到sbtopts文件追加一行-J-Xmx2G把最大堆内存调到2GB绝大多数应用项目就够用了。改完重启sbt进程再试。6.2 IDE的两条路线插件和语言服务器Scala开发环境主流的IDE组合我分成两种路线。路线一是用成熟的JVM IDE加Scala插件。这种IDE本身对Java的支持就很完善装上Scala插件后代码补全、调试、重构都集成在一起。适合以工程为主、需要频繁调试的开发者。首次打开项目时它会触发索引项目大时索引时间可能很长看起来像卡死了其实是在后台建立索引耐心等一会儿就好。路线二是用轻量的代码编辑器加Metals语言服务器。Metals是Scala社区的语言服务器实现能提供补全、跳转定义、错误提示等功能。这种方式启动更快资源占用更低适合写小脚本、学习语法、或者电脑配置一般的情况。配置Metals需要一个Metals扩展和项目里自动生成的Metals配置目录第一次打开项目它会询问是否导入构建选择导入即可。两条路线不冲突我自己是平时轻量编辑用Metals做正经项目时打开IDE。先用REPL验证语法再用IDE做项目思路最顺。6.3 用sbt创建一个最小项目并跑通最后一步用sbt创建一个官方模板项目确保整条开发链路完整。在命令行执行sbt new scala/hello-world.g8这个命令会从模板仓库拉取一个最小的Scala项目。生成后进入项目目录cd hello-world sbt runsbt会自动编译项目并执行主类输出Hello, world!。此时Java、Scala、sbt、构建流程全部打通。如果你不想用模板也可以手写一个build.sbtThisBuild / scalaVersion : 2.13.12 ThisBuild / organization : com.example lazy val hello (project in file(.)) .settings( name : hello )再配上项目源码目录src/main/scala一样能跑。不过对新手来说先用hello-world.g8模板把链路跑通再研究手写构建配置学习曲线更平滑。在整条链路中build.sbt里的scalaVersion决定了项目使用的Scala版本它不一定要和你命令行全局的Scala版本一致。sbt会按照scalaVersion下载对应版本的编译器所以即使全局Scala是3.x项目里依然可以用2.13编译。这是很多人没注意到的细节。老实说我接触Scala的前几年每次遇到环境问题都会有点虚后来总结下来就几句话先确认JDK再确认PATH再确认版本最后才怀疑代码。这套排查顺序帮我省了大量时间。如果你装完Scala后不知道怎么继续建议先花半天时间在REPL里折腾把基础语法跑熟再上sbt建项目最后才进IDE。很多教程把IDE放在第一步其实容易让新手混淆sbt报错和自己的代码报错。先命令行后工具环境这里就不会有太多黑魔法。希望这篇超详细的过程记录能帮你一次把Windows上的Scala环境安排明白。