sbt配置额外unmanagedSourceDirectories后Intellij无法识别源码问题求解
解决方案
原因说明
- 你当前的配置存在循环依赖:
Shared.scala依赖Foo的代码,Foo.scala又依赖Shared的代码,两个编译单元互相依赖,不符合常规项目结构规范,哪怕sbt可临时编译通过,IntelliJ的代码索引逻辑也不支持这种跨模块循环引用。 - 你把同一个
shared目录同时加到多个模块(foo、bar等)的unmanagedSourceDirectories里,IntelliJ识别到同一个路径被多个模块绑定为源码根,就会抛出「Duplicate content roots detected」报错,自动移除重复的路径绑定,导致所有模块都识别不到shared下的代码。
可行修改方案
方案1:抽离shared为独立公共模块(推荐)
把shared目录单独做成一个独立的sbt模块,foo、bar模块都依赖这个公共模块,同时解除循环依赖:
- 调整项目结构,把原来shared目录下依赖Foo/Bar的代码拆分,和业务模块无关的公共代码留在shared模块,依赖foo/bar的逻辑挪回对应业务模块:
// build.sbt 新增独立shared模块 val shared = project .jvmPlatform(Seq("2.13.6", "2.12.15")) // 如果用projectMatrix就和业务模块保持一致的平台配置 .settings() val foo = projectMatrix .jvmPlatform(Seq("2.13.6", "2.12.15")) .dependsOn(shared) // 依赖公共shared模块 .settings( // 删掉原来添加unmanagedSourceDirectories的配置 ) // bar模块同理添加dependsOn(shared)即可
- 调整代码解除循环依赖:把Shared里依赖
Foo.s的逻辑挪到foo模块里,或者把Foo里需要被shared调用的逻辑也抽离到shared模块,避免双向依赖。
方案2:临时兼容(不推荐,仅适合临时调试)
如果暂时不想调整项目结构,可以手动修改IntelliJ的模块配置忽略报错:
- 打开IntelliJ的
File → Project Structure → Modules - 找到对应的foo、bar模块,手动在
Sources标签页把shared目录添加为源码根,遇到重复提示时选择「Keep」不要移除 - 注意该方式每次重新导入sbt配置都会失效,需要重复操作。
内容的提问来源于stack exchange,提问作者Bùi Việt Thành
相关产品推荐
相关产品推荐

