Scala Intellij编译失败:";已定义为;

Scala Intellij编译失败:";已定义为;,scala,intellij-idea,sbt,Scala,Intellij Idea,Sbt,我有一个scala项目,当从命令行使用SBT时,它可以很好地编译、运行和测试。但是,在intellij中构建项目时,项目中的每个类似乎在事件日志中都有此错误,导致构建失败: SendCommandToService is already defined as case class SendCommandToService case class SendCommandToService(service: String, commandName: String, keys: Array[String

我有一个scala项目,当从命令行使用SBT时,它可以很好地编译、运行和测试。但是,在intellij中构建项目时,项目中的每个类似乎在事件日志中都有此错误,导致构建失败:

SendCommandToService is already defined as case class SendCommandToService
case class SendCommandToService(service: String, commandName: String, keys: Array[String], values: Array[String])
       ^

这意味着在类路径中有两个具有相同包和类名的编译类。一个由sbt编译,一个由IntelliJ编译

以下其中一项应能够解决该问题:

  • 尝试使用生成IntelliJ.iml文件,而不是直接导入
  • sbt在IntelliJ中单击“构建->重建”之前进行清理
  • 使用IntelliJ重建时,请确保sbt未运行

  • 我有一个类似的问题反复出现,无论是在想法之内还是之外:简单的SBT


    事实证明,CVS将一些*.scala文件的副本存储在子目录CVS/Base中,SBT显然试图编译该子目录。当我删除CVS子目录时,问题消失了。

    我也有同样的问题,@Max是对的,与编译的类有冲突,但提供的解决方案对我不起作用。事实证明,我正在使用sbt idea生成idea项目结构,作为sbt导入上的一个解决方案,在我写这篇文章时,这个问题还没有解决


    为了修复它,我必须删除模块设置中与
    src\u managed/main/controller
    冲突的
    src\u managed/main
    ,因为存在错误。因此,请仔细检查您的模块源文件夹,确保没有子文件夹与已声明为源的父文件夹冲突。

    对我来说,原因是
    myproject/src
    myproject/src/main/scala
    都标记为源文件夹。因此,由于上述错误,intellij未能构建
    myproject/src/main/scala
    。从
    myproject/src
    取消标记源代码(在intellij中,文件->项目结构,选择myproject模块,在“源代码”选项卡中选择src文件夹,在“添加内容根目录”窗格中将其从源代码中删除)解决了问题。希望这有帮助。

    在我的例子中,问题是protobufIdea插件

  • 删除idea protbuf插件
  • 接近的想法
  • 删除与idea(.idea和.idea_模块)相关的所有文件夹
  • 打开Idea并再次导入项目
  • sbt编译后,我必须将文件夹标记为生成的源根目录,因为我需要这些文件进行编译。

    您需要将“设置->构建、执行、部署->Scala编译器->编译顺序”从“混合”改为“Java然后Scala”。
    如果您以前编译过该项目,您应该首先运行“sbt clean”。

    我将把我的添加到列表中,以防其他初学者犯下这个错误:我通过执行
    cp Foo.scala Foo save.scala
    临时“保存了我的进度”,忘记了sbt将尝试编译目录中的所有
    .scala
    文件

    (我不知道,我想我在考虑编程语言,其中任何没有显式地
    include
    d的文件都被忽略了…)


    当然,因为主文件和“临时备份”文件都定义了相同的类。。。是的。

    您的项目中是否有其他文件中包含
    SendCommandToService

  • 你可以尝试将它重命名为其他名称,看看是否有效

  • 如果您想保留相同的名称,可以将它们放在单独的包中

  • 或者将它们放在不同的封装对象中


  • 在我的例子中,即使在同一个文件中,这也会起作用。通过在Idea中更改ScalaTest模板配置,问题得以解决。我选择
    使用sbt
    ,禁用
    打印信息
    ,在启动前删除构建

    我喜欢使用SBT对特定模块进行清洁/包装/测试。在测试中,我也使用混合的Java/Scala类(但我将编译顺序替换为
    Java,而不是Scala

    至少现在我可以在IDE上进行测试而不会出现这个错误

    PS:现在我禁用
    使用sbt
    。我的测试很好(但我不确定它们是否有效)。
    PPS:编译前不会运行新测试。删除内部版本(或者禁用
    使用sbt
    )是不利的。但是这个额外的构建导致了重复应用的问题,正如我想的那样

    你们试过构建->重建项目吗?是的,我试过了。谢谢。是的,这在Scala+Java混合项目中发生了。这发生在我将项目从
    src
    移动到
    src/main/Scala
    时。我遇到了这个问题,因为我在SBT中定义了一个生成源代码的任务;IntelliJ不知道在编译过程中运行这个,或者生成的代码是在target/scala-2.11/src_管理下的,所以我不得不手动将其添加为源路径,并且在这样做时犯了将父文件夹和子文件夹都标记为源的错误,如上所述。如果文件夹是蓝色的,您知道它已被标记为源代码。在我的情况下,这是根本原因,顺便说一句,scala和java src都不会在我的IDE中导致此错误。使用SBT并在IntelliJ之外播放,投票支持“SBT clean”,这最终为我解决了问题(虽然有一次我也降级了Scala 2.11-->2.10.4)。@JohnLockwood我仍然有这个问题,我已经禁用了缓存,执行
    sbt clean
    sbt compile
    ,但我的简单脚本仍然接收到一个“已定义为对象”的命令..我甚至重命名了对象,我的IntellIJ仍然给我运行上一个对象的选项。谁在没有评论的情况下否决了我的答案?可能是插件开发人员。:)
    object traitdemo{
     object Ex1{
       ...
      }
    }
    object otherdemo{
      object Ex1 {
        ...
       }
    }