Scala多模块项目中父级依赖库类无法被子模块识别求助
解决Scala多模块项目父级依赖子模块无法识别的问题
兄弟,我之前踩过完全一样的Scala多模块依赖坑,折腾了好几个小时才理清,给你几个亲测有效的解决步骤:
检查父级依赖的共享方式是否正确
父级的依赖要让子模块继承,不能直接在根项目的libraryDependencies里瞎写,得用共享配置。比如在父级build.sbt里定义一个公共设置序列,然后子模块引入:// 父级定义共享依赖和设置 val commonSettings = Seq( scalaVersion := "2.13.10", libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.2.15" % Test, "com.typesafe" % "config" % "1.4.2" ) ) // 子模块必须引入这个commonSettings才能继承依赖 lazy val coreModule = (project in file("core")) .settings(commonSettings) .settings( // 子模块专属的配置写在这 )要是父级只是直接写
libraryDependencies ++= ...而没封装成共享设置,子模块根本拿不到这些依赖,这是最常见的错误。确认子模块的项目关联配置
检查父级build.sbt里有没有正确聚合和配置子模块:// 根项目要聚合所有子模块 lazy val root = (project in file(".")) .aggregate(coreModule, apiModule) .settings(commonSettings) // 根模块自己也可以用共享设置 lazy val apiModule = (project in file("api")) .dependsOn(coreModule) // 如果api依赖core模块,必须加这个 .settings(commonSettings) // 同样要引入共享设置子模块要是没加
.settings(commonSettings),肯定识别不了父级的依赖。先通过命令行验证编译,再同步IDE
有时候IDE(比如IntelliJ)的同步会抽风,先别着急折腾IDE,先在项目根目录跑sbt clean compile:- 如果命令行能正常编译通过,说明sbt配置没问题,就是IDE的锅。这时候去IntelliJ的
sbt面板点Refresh all sbt projects(那个循环箭头按钮),或者重新导入一次项目。 - 如果命令行编译也报错,那就是配置问题,回到前两步检查。
- 如果命令行能正常编译通过,说明sbt配置没问题,就是IDE的锅。这时候去IntelliJ的
排查依赖冲突或版本问题
偶尔会出现父级依赖和子模块本地依赖版本冲突的情况,导致IDE识别失败。可以用sbt dependencyTree命令打印依赖树,看看有没有冲突的依赖。如果有,在子模块里排除冲突项:libraryDependencies += "com.typesafe" % "config" % "1.4.2" exclude("org.slf4j", "slf4j-api")
内容的提问来源于stack exchange,提问作者More Than Five
相关产品推荐
相关产品推荐

