Scala多项目构建中Scala3项目依赖Scala2.13子项目的等效配置
Scala多项目构建:Scala 3项目依赖Scala 2.13子项目的可行性
问题描述
在Scala多项目构建场景中,若存在一个基于Scala 2.13且暂无法升级至Scala 3的legacy子项目,同一构建中的Scala 3项目能否依赖该legacy项目?是否可以像对第三方库依赖使用CrossVersion.for2_13Use3那样,指定使用其Scala 2.13版本?
用户当前的依赖配置示例:
lazy val appServer = project.in(file("app-server")) .dependsOn(common, legacy)
解答
核心结论
可以实现,但不能直接使用默认的dependsOn源码依赖,需要调整配置以引用legacy项目的Scala 2.13编译产物,同时启用Scala 3对Scala 2.13字节码的兼容性支持。
具体实现方案
方案1:通过库依赖方式配置交叉版本
将legacy子项目作为本地库依赖引入,并指定CrossVersion.for2_13Use3规则,确保Scala 3项目识别其Scala 2.13版本的产物:
lazy val appServer = project.in(file("app-server")) .settings( scalaVersion := "3.3.1", // 替换为你的Scala 3版本 // 引入legacy项目的编译产物,指定交叉版本规则 libraryDependencies += (legacy % "compile;test->test").cross(CrossVersion.for2_13Use3) )
方案2:直接引用编译产物JAR
如果需要更直接的控制,可以直接将legacy项目编译生成的JAR包加入Scala 3项目的类路径:
lazy val appServer = project.in(file("app-server")) .settings( scalaVersion := "3.3.1", // 引入legacy项目的编译产物JAR unmanagedJars in Compile += (packageBin in legacy).value, // 若需要测试依赖,同时引入测试编译产物 unmanagedJars in Test += (packageBin in (legacy, Test)).value )
关键注意事项
- 默认的
dependsOn会触发源码级依赖,Scala 3项目会尝试用自身版本编译legacy的Scala 2.13代码,必然引发兼容性错误,因此必须避免这种方式。 CrossVersion.for2_13Use3的作用是让Scala 3编译器兼容Scala 2.13生成的字节码,该规则对本地子项目的产物同样有效。- 确保
legacy项目已提前完成Scala 2.13版本的编译,避免Scala 3项目触发其重新编译。
内容的提问来源于stack exchange,提问作者Roberto Tyley
相关产品推荐
相关产品推荐

