无需构建工具如何管理Scala应用?手动维护依赖并运行可行吗?
当然可以不用SBT或其他构建工具来手动管理Scala项目,只是过程会繁琐不少——毕竟构建工具就是为了帮我们省掉这些重复机械的工作嘛。咱们先搞清楚为啥直接运行scala app.scala会报错,再一步步说手动操作的方法。
为啥直接运行scala app.scala会报错?
scala命令默认只会把当前目录和Scala标准库加到JVM的类路径里。你导入的第三方依赖(比如Akka、Circe这些)既不在当前目录,也不属于标准库,JVM找不到对应的类文件,自然就会抛出“找不到导入项”或者“找不到类”的错误。
手动管理依赖并运行的具体步骤
1. 手动下载所有依赖JAR包
首先得明确你需要的依赖及其版本,比如你要用到JSON解析库circe-core_2.13:0.14.6。你需要去对应的Maven仓库平台下载这个JAR包,还要下载它所有的传递依赖——比如Circe依赖cats-core、parboiled等,这些也得一起下载下来。把所有下载好的JAR包放到项目根目录下的lib/文件夹里(自己创建这个目录就行)。
2. 带类路径参数运行脚本
用scala命令时,通过-cp(或者全称-classpath)参数把所有依赖JAR和当前目录都加入类路径。举个例子:
如果你的主文件是app.scala,依赖都在lib/目录下,在Linux/macOS上运行的命令是:
scala -cp "lib/*:." app.scala
Windows系统下路径分隔符是分号;,所以命令要改成:
scala -cp "lib/*;." app.scala
这里lib/*会自动把lib/下所有JAR包加入类路径,.代表当前目录(你的Scala源文件所在位置)。
3. 多文件项目:先编译再运行(可选)
如果你的项目有多个Scala源文件,先编译成字节码再运行会更高效。用scalac命令编译,同样指定类路径:
scalac -cp "lib/*" *.scala
编译完成后会生成一堆.class文件,然后用scala命令运行主类(假设你的主类是MyApp):
scala -cp "lib/*:." MyApp
这种场景到底可行吗?有没有必要?
- 绝对可行:对于非常简单的小项目(比如单个源文件,依赖极少且容易手动梳理),手动管理完全没问题。比如你只是写个小脚本验证某个功能,用到一两个简单的依赖,手动下JAR包加类路径就能搞定。
- 但不推荐用于中等及以上规模的项目:一旦依赖变多,传递依赖的追踪会非常头疼——你得自己查每个依赖的依赖项,还要处理版本冲突问题;后续更新依赖也得手动下载替换JAR包,这些工作构建工具(SBT、Mill、Coursier)都能自动帮你完成,效率高太多。
总结
不是所有有依赖的Scala项目都必须用构建工具,只是手动管理的成本会随着项目复杂度上升而急剧增加。如果是快速验证小功能,手动操作完全OK;但如果是正经开发项目,用SBT或者同类工具能帮你省掉超多不必要的麻烦。
内容的提问来源于stack exchange,提问作者sge

