为什么sbt会把scala-library-2.13加到Scala 3项目的类路径中?

编程语言 2026-07-09

得到这个build.sbt

resolvers += "Maven Central" at "https://repo1.maven.org/maven2/"
name := """Test"""
version := "1.0"
scalaVersion := "3.3.7"

……以及这个project/build.properties

sbt.version=1.12.10

从中我得到这个(对我而言)令人惊讶的类路径:

sbt 'show runtime:fullClasspath'
[info] welcome to sbt 1.12.10 (Homebrew Java 26.0.1)
[info] loading settings for project test-build from plugins.sbt...
[info] loading project definition from .../test/project
[info] loading settings for project test from build.sbt...
[info] set current project to Test (in build file:/.../test/)
[warn] sbt 0.13 shell syntax is deprecated; use slash syntax instead: Runtime / fullClasspath
[info] * Attributed(.../test/target/scala-3.3.7/classes)
[info] * Attributed(.../.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.7/scala3-library_3-3.3.7.jar)
[info] * Attributed(.../.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.16/scala-library-2.13.16.jar)
[success] Total time: 0 s, completed 24. mai 2026, 23:45:52

而且它居然连在依赖树里都没有露面:

# sbt dependencyTree
[info] welcome to sbt 1.12.10 (Homebrew Java 26.0.1)
[info] loading settings for project test-build from plugins.sbt...
[info] loading project definition from .../test/project
[info] loading settings for project test from build.sbt...
[info] set current project to Test (in build file:.../test/)
[info] default:test_3:1.0
[info]   +-org.scala-lang:scala3-library_3:3.3.7 [S]
[info]   
[success] Total time: 0 s, completed 24. mai 2026, 23:48:12

解决方案

因为Scala 3(低于3.8)与Scala 2.13共享标准库——尽管它在此基础上又添加了若干东西——否则你就无法在同一个项目中同时使用2.13和 3的构件,并共用同一个标准库。

请参阅例如 https://mvnrepository.com/artifact/org.scala-lang/scala3-library_3/3.7.4/dependencies

自3.8版本起,标准库使用Scala 3编译,这样就能更好地支持Scala 3的特性,同时也不再支持从Scala 2.13使用Scala 3(.8+) 构件。

但你使用的是3.3.7,它仍然支持与2.13的跨版本编译。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章