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框架了。但我猜你错过了anorm
和ehcache
库,为什么你使用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 树中找到丢失的类,而编译器不会。
在您的情况下,缺少的导入是 guice
。 AkkaGuiceSupport
是 guice
的一部分。尝试将其添加到您的库依赖项中:
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: docker:publichLocal 和特定的 .conf 文件
是否可以在不运行“sbt clean”的情况下运行 Scala SBT Scoverage
Scala sbt 程序集 jar 不起作用(未找到类实现)但通过 IntelliJ 时代码可以工作 [关闭]
执行 JAR 后 Scala SBT Shell 中的 java.lang.NoSuchMethodError [重复]