【问题标题】:Scala "not found: object com" - should i really add entry in build.sbt if there are no other dependencies?Scala“未找到:object com”-如果没有其他依赖项,我真的应该在 build.sbt 中添加条目吗?
【发布时间】:2021-07-30 05:43:45
【问题描述】:

我已经使用https://www.playframework.com/getting-started play-scala-seed 创建了基本的 Scala Play 应用程序。该项目使用sbt run 编译和运行。但是我有另一个可以编译和运行的 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,这正是在 Play 应用程序的 Scala 控制器文件中编译 import com.agiintelligence 行时出现的错误消息。

当然 - 已报告并解决了此类错误,例如object play not found in scala application 但该解决方案建议附加 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 项目窗格中可以看到)几十个“外部库”(它也显示了我的 com.agiintelligence jar),但是为什么我应该在 build.sbt 中添加我自己的 ivy2 库如果此处没有列出其他库,则文件?我的图书馆有什么不同?它已经在我的计算机上,在存储库中吗?

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

【问题讨论】:

  • 您的应用程序是否依赖于com.agiintelligence?然后在依赖项中列出它。为什么这样问? “它在我的计算机上,已经在我的存储库中” - 这很好,然后sbt 将不必下载任何额外的东西。这不会改变您的应用程序依赖于 com.agiintelligence 的事实。
  • 如果出现至少一张接近投票,那么我将删除我的问题。我不确定谁会从删除我的问题中受益,但我会删除它。我的观点是社区可以从这个 QA 中的建议和解释中受益,有时每一个提示和建议在缩小问题范围并尝试解决时都非常有价值。 OMG,作为开发人员,我知道!但是如果社区对这些信息进行了近距离投票,那么我一定会删除它,我不需要近距离投票。

标签: scala playframework ivy


【解决方案1】:

我的 Play 应用程序包含(从 IntelliJ 项目窗格中可以看出)几十个“外部库”

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

为什么仅列出 Project-Setting--External Libraries in IntelliJ 是不够的?

这对于 IDE 来说已经足够了,但对于构​​建工具来说还不够。构建工具独立于 IDE;它不知道。 sbt 只知道您在定义文件中配置的依赖项。

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

【讨论】:

    【解决方案2】:

    我通过在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 的评论给出了解释,该评论是对我问题的实际和预期答案。

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 2020-07-17
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2020-01-01
      • 1970-01-01
      相关资源
      最近更新 更多