Intellij编译失败:"已被定义为"

时间:2013-06-02 17:41:49

标签: 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], values: Array[String])
       ^

10 个答案:

答案 0 :(得分:97)

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

答案 1 :(得分:31)

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

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

  1. 尝试使用sbt-idea生成IntelliJ .iml文件,而不是直接导入。
  2. 单击Build之前sbt clean - >在IntelliJ中重建
  3. 使用IntelliJ重建时,请确保sbt未运行

答案 2 :(得分:5)

我有同样的问题而@Max是对的,与编译的类存在冲突,但提供的解决方案对我不起作用。事实证明,我正在使用sbt-idea来生成IDEA项目结构,作为SBT导入上Intellij IDEA 14 + scala plugin bug的变通方法,在我写这篇文章时尚未修复。

为了解决此问题,由于sbt-idea bug,我必须删除模块设置中与src_managed/main/controller冲突的src_managed/main。因此,请仔细检查您的模块源文件夹,并确保没有与已声明为源的父文件夹冲突的子文件夹。

答案 3 :(得分:2)

我在Idea和没有的内容中反复出现过类似的问题:简单的SBT。

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

就我而言,问题是protobuf Idea插件

  1. 删除主题protbuf插件。
  2. 关闭提示
  3. 删除与idea相关的所有文件夹(.idea和.idea_modules)
  4. 打开Idea并再次导入项目。

答案 6 :(得分:0)

sbt compile 之后,我必须将文件夹标记为 Generated Sources Root ,因为我需要这些文件进行编译。

答案 7 :(得分:0)

如果其他人犯了这个初学者的错误,我将添加我的列表:我暂时通过cp Foo.scala Foo-save.scala“保存了进度”,而忘记了sbt会尝试编译所有.scala目录中的文件。

(我不知道,我想我正在考虑编程语言,其中忽略了任何未明确include d的文件...)

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

答案 8 :(得分:0)

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

  1. 您可以尝试将其重命名为其他名称,看看是否可行

  2. 如果要保留相同的名称,可以将它们放在单独的程序包中。

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

object traitdemo{
 object Ex1{
   ...
  }
}
object otherdemo{
  object Ex1 {
    ...
   }
}

即使在同一文件中也可以使用

答案 9 :(得分:0)

就我而言,通过更改Idea中的ScalaTest模板配置解决了问题。我选择library(dplyr) dat %>% group_by(group, month) %>% slice_max(year) ,禁用use sbt,在启动前删除构建。

我喜欢使用SBT对特定模块进行清洁/包装/测试。我还在测试中使用了Java / Scala混合类(但我将编译顺序替换为print info)。

至少现在我可以从IDE进行测试,而不会出现此错误。

PS:现在我禁用了Java than Scala。我的测试工作正常(但我不确定它们是否可以工作)。 PPS:编译前不会运行新测试。删除构建(以及可能禁用use sbt)是不利的。但是我认为,这种额外的构建会导致复制问题