Scala "not found: object com" - 如果没有其他依赖项,我真的应该在 build.sbt 中添加条目吗?

Scala "not found: object com" - should i really add entry in build.sbt if there are no other dependencies?

我已经使用 https://www.playframework.com/getting-started play-scala-seed 创建了基本的 Scala Play 应用程序。该项目编译 运行s 与 sbt run。但是我有另一个编译和 运行s 的 Scala 项目,我已经使用命令 sbt publishLocal 将其提交到我的本地 Ivy 存储库。由于此命令,此其他项目已保存在 C:\Users\tomr\.ivy2\local\com.agiintelligence\scala-isabelle_2.13\master-SNAPSHOT

然后我在 IntelliJ 中导入(正是这样 - 导入,不是刚刚打开)我的 Play 项目,我使用 Project - Open Module Settings - Project Settings - Libraries 从我的 ivy2 位置添加 com.agiintelligence jar。经过这样的操作,IntelliJ 编辑器识别出 com.agiintelligence 类。没关系。

但是当我尝试使用 sbt run 来 运行 我的 Play 应用程序时,我遇到错误消息 not found: object com 这正是在我的 Scala 中编译 import com.agiintelligence 行时Play 应用程序的控制器文件。

当然 - 已报告并解决了此类错误,例如 但是该解决方案建议附加 build.sbt 文件。我的 build.sbt 文件非常简单:

name := """agiintelligence"""
organization := "com.agiintelligence"

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.13.5"

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test

// Adds additional packages into Twirl
//TwirlKeys.templateImports += "com.skaraintelligence.controllers._"

// Adds additional packages into conf/routes
// play.sbt.routes.RoutesKeys.routesImport += "com.skaraintelligence.binders._"

我的 Play 应用程序包含(从 IntelliJ 项目窗格中可以看出)几十个 'external libraries'(它也显示了我的 com.agiintelligence jar),但我为什么要添加自己的 ivy2 build.sbt 文件中的库,如果此处未列出其他库?我的图书馆有什么不同?它在我的电脑上,已经按预期在存储库中了吗?

当然,我可以尝试添加它build.sbt并发出sbt update,看看会发生什么,但我无法理解这个逻辑?有人可以解释它并提供一些线索来理解我的错误消息的解决方案吗?

我通过在 build.sbt 文件

中添加行解决了错误消息

libraryDependencies += "de.unruh" %% "scala-isabelle" % "master-SNAPSHOT"

以及 sbt update 的后续 运行。

错误已解决,但主要问题仍然存在 - 为什么我必须这样做?为什么有数十个依赖项没有在 build.sbt 中列出,为什么我应该在 build.sbt 中列出我的依赖项,为什么仅在 IntelliJ 中列出它 Project-Setting--External Libraries 是不够的?

好的,@Luis_Miguel_Mejía_Suárez 的评论给出了解释,该评论是我问题的实际和预期答案。

My Play application contains (as can bee seen from the IntelliJ project pane) some tens of 'external libraries'

这些可能只是你的 Play 依赖的传递依赖,这就是为什么 sbt 下载所有它们并将它们放在你的类路径中这样您就可以使用它们而无需告知它们;因为 Playpom 已经玩过了。
并不是构建工具或 IDE 神奇地为您添加了所有这些依赖项,因为它们读懂了您的想法并神奇地理解了您想要它们。并且出于某种原因,魔法停止为您自己的图书馆工作。

Why it is not sufficient to list it Project-Setting--External Libraries in IntelliJ only?

这足以让 IDE 正常工作,但不适用于构建工具。构建工具独立于 IDE;它不知道这件事。 sbt 只知道您在定义文件中配置的依赖项。

更重要的是,您应该始终在构建工具上配置依赖项,然后将其导入 IDE;而不是相反。 IDEs 是图形工具,所以它们的状态不能提交,不能共享,不能跟踪变化,不能在 CI / CD 环境中使用;此外,不同的队友可能想要使用不同的 IDEs。