Scala/SBT:“对象不是包的成员”,但对象在外部库中

Posted

技术标签:

【中文标题】Scala/SBT:“对象不是包的成员”,但对象在外部库中【英文标题】:Scala/SBT: "object is not a member of package", but the object is in external libraries 【发布时间】:2021-03-31 00:13:13 【问题描述】:

在 Scala 2.13.4/SBT 1.2.8 项目中,MyService.scala 类具有此导入:

import play.api.libs.concurrent.AkkaGuiceSupport

我认为包含此类的库是由sbt 添加的,作为我在build.sbt 中添加为libraryDependencies 的库之一的依赖项。

但是当我编译项目时,我得到:

$ sbt -java-home /usr/lib/jvm/java-8 -jvm-debug 9999 run
...
[info] Compiling 31 Scala sources and 1 Java source to /home/me/projects/my_project/target/scala-2.13/classes ...
[error] /home/me/projects/my_project/app/actors/MyService.scala:8:8: object AkkaGuiceSupport is not a member of package play.api.libs.concurrent
[error] import play.api.libs.concurrent.AkkaGuiceSupport
[error]        ^

在 IntelliJ 中,在项目的外部库中,我可以看到:

我错过了什么?

此编译错误的原因可能是什么?

.................................................. .........

更新:

build.sbt

name := "CH07"

version := "1.0"

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

scalaVersion := "2.13.4"

resolvers += "Spy Repository" at "http://files.couchbase.com/maven2"

libraryDependencies ++= Seq(
  jdbc,
  cacheApi,
  ws,
  "com.github.mumoshu" %% "play2-memcached-play28" % "0.11.0",
  "org.hsqldb" % "hsqldb" % "2.5.0",
  "org.jooq" % "jooq" % "3.14.4",
  "org.jooq" % "jooq-codegen-maven" % "3.14.4",
  "org.jooq" % "jooq-meta" % "3.14.4",
  "joda-time" % "joda-time" % "2.7",
  "com.ning" % "async-http-client" % "1.9.29",
  "com.github.scullxbones" %% "akka-persistence-mongo-common" % "3.0.5",
  "com.typesafe.akka" %% "akka-persistence" % "2.6.10",
  "com.typesafe.akka" %% "akka-persistence-query" % "2.6.10",
  "com.typesafe.akka" %% "akka-persistence-typed" % "2.6.10"
)

routesGenerator := InjectedRoutesGenerator

project/plugins.sbt

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.7")

project/build.properties

sbt.version=1.3.10

【问题讨论】:

很久没用play框架了。但我猜你错过了anormehcache 库,为什么你使用ch07 而不是lazy val root = (project in file(".")).enablePlugins(PlayScala),因为这里提到-> playframework.com/documentation/2.8.x/BuildOverview @Felipe 不管使用什么库。如果你看到一个类在类路径上,是什么导致编译器看不到它? 我同意你的看法。但也许有一些我们不知道的依赖关系,因为 Play 在下面使用 akka 并且版本可能会有所不同。我只是认为这值得测试.... @Felipe 我应该提一下,在 Intellij 中,Play 插件(在 project/plugins.sbt 中)以及在 build.sbt 中添加的 akka-persistence 和 play-memcached 依赖项 - 被标记为“未知的工件。未解决或编入索引。”但是,项目中导入的大多数 akka 和 play 类都由编译器解析(在命令行中由 sbt 和 intellij 解析)。很奇怪。 Rapt,我的回答对你有帮助吗? 【参考方案1】:

首先,您可以看到它,因为它是游戏框架的一部分。您可以在PlayImport 中看到更多您没有导入但它们因为游戏而存在的包。例如,如果您从libraryDependencies 中删除jdbc,您可能会看到更多此类错误(只是使用不同的包名称,并且仅在您实际使用它的情况下)。请注意,您将能够在 IntelliJ 树中找到丢失的类,而编译器不会。

在您的情况下,缺少的导入是 guiceAkkaGuiceSupportguice 的一部分。尝试将其添加到您的库依赖项中:

libraryDependencies ++= Seq(
  guice, // This is the missing part
  jdbc,
  cacheApi,
  ws,
  "com.github.mumoshu" %% "play2-memcached-play28" % "0.11.0",
  "org.hsqldb" % "hsqldb" % "2.5.0",
  "org.jooq" % "jooq" % "3.14.4",
  "org.jooq" % "jooq-codegen-maven" % "3.14.4",
  "org.jooq" % "jooq-meta" % "3.14.4",
  "joda-time" % "joda-time" % "2.7",
  "com.ning" % "async-http-client" % "1.9.29",
  "com.github.scullxbones" %% "akka-persistence-mongo-common" % "3.0.5",
  "com.typesafe.akka" %% "akka-persistence" % "2.6.10",
  "com.typesafe.akka" %% "akka-persistence-query" % "2.6.10",
  "com.typesafe.akka" %% "akka-persistence-typed" % "2.6.10"
)

【讨论】:

以上是关于Scala/SBT:“对象不是包的成员”,但对象在外部库中的主要内容,如果未能解决你的问题,请参考以下文章

Scala:SBT 为每个阶段捆绑不同的库依赖项

播放 / Scala / sbt: docker:publichLocal 和特定的 .conf 文件

是否可以在不运行“sbt clean”的情况下运行 Scala SBT Scoverage

Scala sbt 程序集 jar 不起作用(未找到类实现)但通过 IntelliJ 时代码可以工作 [关闭]

执行 JAR 后 Scala SBT Shell 中的 java.lang.NoSuchMethodError [重复]

SBT 项目刷新失败 [IntelliJ、Scala、SBT]