【问题标题】:Scala import not working - object <name> is not a member of package, sbt preppends current package namespace in importsScala 导入不起作用 - 对象 <name> 不是包的成员,sbt 在导入中添加当前包命名空间
【发布时间】:2014-02-11 12:09:06
【问题描述】:

尝试在 scala 中导入时遇到问题。对象Database 存在于com.me.project.database 下,但是当我尝试导入它时:

import com.me.project.database.Database

我得到错误:

object Database is not a member of package com.me.project.controllers.com.me.project.database

任何想法是什么问题?

编辑

值得一提的是,导入是在 com.me.project.controllers 包下的 Application.scala 文件中,但我不明白为什么它会将导入附加到当前包,奇怪...

编辑 2

所以使用:

import _root_.com.me.project.database.Database

如下所述。但是如果没有_root_,它应该可以工作吗?到目前为止的 cmets 似乎表明应该这样做。

回答

事实证明,我只需要清理项目以使导入正常工作,同时使用两者:

import _root_.com.me.project.database.Database

import com.me.project.database.Database

是有效的解决方案。 Eclipse 刚刚弄糊涂了。

【问题讨论】:

  • 您能否提供一个显示此编译错误的最小示例?
  • 错误是从哪一行报告的——使用点还是导入点?如果从导入中,数据库是否可能不在您的类路径中?然后,scalac 将无法猜测它是绝对包路径还是相对包路径,并且在生成错误消息时可能会猜错。
  • 它来自导入,但数据库类在我的项目中,它不是另一个项目或外部库,所以我不应该有任何类路径问题(我来自Java 视角,我刚接触 Scala 2 天)。
  • 伙计,晚了 5 年,我得到了这篇文章的帮助,遇到了完全相同的问题。我只想指出,标题有点……不好,伙计。我用一般的谷歌搜索找不到这个——我试了很多次,半个小时才到这里。这个问题非常好,有助于澄清一个非常随机的问题——我会继续努力让它工作,而不是重新启动该死的 SBT 会话。请给这个更多的可见性 - 将标题改进为“导入在导入中预先添加当前包命名空间”之类的内容。..
  • @LucasLima 这个问题有 39k 的浏览量,所以有些人会发现它,但我同意你的观点 ;) 改变了

标签: scala


【解决方案1】:

导入可以是相对的。那是你唯一的进口吗?小心其他进口,如

import com.me

最终,这应该可以解决它,然后您可以尝试找到更多关于它的信息:

import _root_.com.me.project.database.Database

【讨论】:

  • @Neilos,查看重要编辑 - _root_ 被下划线包围。
  • 谢谢两位。我通过在 scala 相对导入上进行了一些谷歌搜索,找出了下划线。它看起来很奇怪,我不完全理解为什么需要_root_ 标签,我不想在每次导入之前用_root_ 乱扔我的代码。尽管如此,这确实有效。
  • 避免导入包或导入包中的所有内容,如 com.me._
【解决方案2】:

在我的情况下,我还需要检查未作为包成员找到的对象是否已成功编译。

【讨论】:

  • 我必须 cd 到项目根目录,然后运行 ​​sbt
【解决方案3】:

就我而言,我必须运行 sbt clean

【讨论】:

  • 这里完全一样!我同时拥有 Java 和 Scala 代码以及两者的包名。重构后,编译器会无缘无故地抱怨这个错误 =/ sbt clean &amp;&amp; sbt compile 为我工作!
  • 你可以通过像运行sbt clean compile而不是sbt clean &amp;&amp; sbt compile来链接sbt任务
【解决方案4】:

我意识到这个问题已经有一个公认的答案,但由于我遇到了同样的问题,但原因不同,我想我会添加一个答案。

我有一堆相互依赖的项目,突然需要一个根导入才能编译。事实证明,我在一个文件中复制了包声明。这引起了某种连锁反应,很难找到问题的根源。

总结一下

package foo.bar
package foo.bar

在文件的顶部而不是仅仅

package foo.bar

希望这可以为某人节省一些非常繁琐的错误查找。

【讨论】:

  • 仅供参考,如果我在 Eclipse 中执行相同操作,则会出现编译器错误,我建议使用 IDE,如果是的话,我建议检查错误报告(在 Eclipse Luna 中它是 Window>首选项>Java>编译器>错误/警告)
  • 谢谢,我使用的是 Scala IDE 4.0.0,编译器设置为 2.10,JVM 目标设置为 1.7。我知道它在 java 中是非法的,但在 Scala 中我相信它应该是有效的。 [尝试添加一个有效的 ideone.com 链接,但 ideone 似乎在包声明方面存在问题。] 它在我的 Scala IDE 中确实有效。多个包声明应该在 Scala 中工作。见stackoverflow.com/questions/3541053/…
  • 我不好,是的,问题是关于 scala,我在两者之间切换,所以我很困惑
  • 非常感谢!这确实为我节省了很多时间——而且我已经浪费了很多时间。我没有双包问题,但有类似的问题:在 Scala IDE 中,文件显示在未声明的包中,这非常烦人,例如可以轻松地将标记为 package name.me.test 的文件放在 IDE name.test 中的“可见”包中,这将在某处(感觉随意)显示错误“……未找到”。
  • Scala 及其开发生态系统很奇怪。
【解决方案5】:

我遇到过类似的问题,IntelliJ 在从同一个项目中导入一个文件时显示错误。

在我的情况下什么没有解决问题:

  1. 在导入语句中添加_root_
  2. sbt 清洁
  3. 重启机器

究竟是什么解决了这个问题:

  1. 主菜单 => 选择文件 => 点击 Invalidate Caches / Restart => 弹出 dailog => 点击使缓存无效并重新启动。

我在 macOs mojave 10.14.6 上使用 IDEA(2019.2.2 Ultimate Edition)

【讨论】:

    【解决方案6】:

    Java -> Scala 转换无需清理

    如果您将项目中的某些文件从 Java 转换为 Scala,请不要忘记清理。在我将 Java 类转换为 Scala 对象之后,我运行了一个持续集成构建,即使构建在本地工作,我也无法让事情工作。解决方案:在 CI 服务器上的构建过程中添加“干净”。我相信,Scala 中生成的 .class 文件的名称与 Java 类的名称略有不同,因此这很可能是导致问题的原因。

    【讨论】:

      【解决方案7】:

      如果您使用gradle 作为构建工具,请确保jar 任务未被禁用。

      我的项目中有多个模块,其中一个模块依赖于其他几个模块。但是,我在build.gradle 中禁用了jar 任务:

      jar { enabled = false }

      这导致它无法解析依赖模块中的类并失败并出现上述错误。

      【讨论】:

        【解决方案8】:

        我会分享我的故事,以防万一它对某人有所帮助。

        场景: intellij 编译成功,但 import com.foo.Bar 上的 gradle 构建失败,其中 Bar 是一个 scala 类。

        TLDR 原因: Bar 位于 src/main/java/... 下,而不是 src/main/scala/...

        实际原因: Bar 未被 compileScala gradle 任务(来自 gradle scala 插件)编译,因为它仅在 src/&lt;sourceSet&gt;/scala 下查找 scala 源。

        来自docs.gradle.org

        所有 Scala 源目录都可以包含 Scala 和 Java 代码。这 Java 源目录可能包含 Java 源代码。

        希望对你有帮助

        【讨论】:

          【解决方案9】:

          我遇到了类似的问题,但这里的解决方案都不适合我。然而,真正起作用的是我的机器的简单重启。

          也许这是我的 Intellij 的问题,但在快速重启后,一切似乎都正常。

          【讨论】:

            【解决方案10】:

            我有类似的情况,在命令行上的 IntelliJ 和 maven 都失败了。我去应用建议的临时修复(添加 _root_),但 intellij 的故障非常严重,甚至不可能。

            最终我注意到我错误地创建了一个包,因此它重复了包的整个路径。这意味着我的班级所在的目录有一个名为“com”的子文件夹,我的文件的开头看起来像:

            package com.mycompany.mydept.myproject.myfunctionality.sub1
            
            import com.holdenkarau.spark.testing.DataFrameSuiteBase 
            

            我有另一个包叫 com.mycompany.mydept.myproject.myfunctionality.sub1.com.mycompany.mydept.myproject.myfunctionality.sub2

            编译器在 com.mycompany.mydept.myproject.myfunctionality.com 下寻找“holdenkarau”但失败了。

            【讨论】:

              【解决方案11】:

              我在使用 Intellij 和内置 sbt shell 时遇到了这个问题(确切地说,我试图运行命令 console,它会调用代码)。

              就我而言,在尝试了此线程上的其他建议解决方案后,我发现我可以重新启动 sbt shell 并且它会消失。左侧有一个按钮,一个绿色的环形箭头和一个灰色的小方块,一键完成(显然,这取决于 Jet Brains 不改变 IDE 的设计!!!)。

              我希望这可以帮助一些人快速解决这个问题。

              【讨论】:

                【解决方案12】:

                在我的例子中,在 Intellij 中,只需将包文件重命名为其他内容 >> 看看它是否更新了 import 语句 >> 运行代码 >> 然后重命名回原来的名称。

                【讨论】:

                  猜你喜欢
                  • 2011-03-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-03-31
                  • 2022-07-06
                  • 2012-05-18
                  • 1970-01-01
                  • 2017-03-09
                  相关资源
                  最近更新 更多