Intellij 编译失败:"is already defined as"



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

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

对我来说,原因是myproject/srcmyproject/src/main/scala都被标记为Source。因此,由于上述错误,IntelliJ无法构建myproject/src/main/scala。取消标记源码从myproject/src(在IntelliJ,文件>项目结构,选择我的项目模块,选择src文件夹在源选项卡,在"添加内容根"窗格)解决了这个问题。

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

应该可以解决这个问题:

  1. 尝试用sbt-idea生成IntelliJ .iml文件,而不是直接导入。
  2. 在IntelliJ中单击Build -> Rebuild之前先清除
  3. 当用IntelliJ重建时,确保sbt没有运行

我今天在IntelliJ 2021.2.1上遇到了这个问题,根据这个页面,这是IntelliJ的Scala增量编译器的一些问题,所以解决方案是改变"增量类型"。从"IDEA";Zinc"偏好设置->构建、执行、部署->编译器→Scala编译器

对于我来说,解决方案是仔细检查IntelliJ中每个模块中的源文件夹。

File > Project Structure > Modules和每个模块,仔细检查Source Folders只包含您预期的文件夹,例如src/main/scala,并且不包含任何生成的源(例如target/scala-2.12/src_managed/main .

我有同样的问题和@Max是对的,与编译的类有冲突,但提供的解决方案不适合我。事实证明,我使用SBT - IDEA来生成IDEA项目结构,作为SBT导入上的Intellij IDEA 14 + scala插件错误的解决方案,在我写这篇文章的时候还没有固定。

为了修复它,我不得不删除src_managed/main/controller,这是与src_managed/main在模块设置冲突,因为一个sbt-idea错误。因此,请仔细检查模块源文件夹,并确保子文件夹与已声明为源的父文件夹没有冲突。

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

我在Idea和没有使用plain SBT的情况下都多次遇到类似的问题。

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

问题是由.idea/modules/<your_project_name>.iml文件中的重复行引起的。检查你是否有重复的<source_folder>标签。

在我的情况下,我在src/test/scala路径中的所有类都有同样的问题,并且在删除此路径的重复标记后,项目构建良好。

您的项目中有SendCommandToService的其他文件吗?

  1. 你可以试着把它重命名为其他东西,看看是否有效

  2. 如果你想保持相同的名称,你可以把它们放在单独的包中。

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

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

,这将工作,即使在同一个文件

在我的情况下,通过改变ScalaTest模板配置在Idea解决的问题。我选择use sbt,禁用print info,在启动前删除构建。

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

至少现在我可以从IDE测试没有这个错误。

PS:现在禁用use sbt。我的测试工作得很好(但我不确定,他们将工作)。PPS:编译前未运行的新测试。删除构建(也许禁用use sbt)是不利的。但是这个额外的构建会导致发布问题,因为我认为

File ->无效缓存/重新启动为我工作。其他答案都没有。

sbt编译之后,我不得不将文件夹标记为生成源根,因为我需要这些文件进行编译。

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

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

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

我有同样的错误消息,结果是IntelliJ出于某种原因创建了一些现有源文件的副本。例如,我有一个被git跟踪的文件Attribute.scala,然后在同一目录下有一个未被跟踪的文件Atrribute 2.scala,其内容相同(我从未创建过)。这当然是一个问题,因为编译器认为它们是项目的一部分,因此会出现重复对象定义错误。

我不能100%确定这是什么时候发生的(我怀疑是在git rebase期间)。因此,如果您再次遇到这个问题,如果您有一些未跟踪的文件重复跟踪文件的内容,也值得检查git status

删除未跟踪文件,问题就解决了。

感谢这个问题,它帮助我解决了这个问题。

我的案例是一个混合了Scala、Java和Avro模式的项目。IDE: IntelliJ IDEA 2022.1.3

如何一步一步地解决它(in IntelliJ):

  1. File -> Project Structure
  2. Project Settings -> Modules
  3. 现在我们需要修复"source"文件。我在每个模块中搜索target/scala-2.12/src_managed,并将其标记为"源目录"(蓝色)。
  4. 在所有模块中未标记所有其他路径,如target/scala-2.12/*(在我的情况下是target/scala-2.12/src_managed/main/compiled_avro)。作为我项目中的一个例子,我只在其中一个模块中留下了这些源:target/scala-2.12/src_managed, src/main/scala
  5. 保存更改并重新构建项目。

补充:哦,看起来有时当你在IntelliJ之外编译你的scala项目(使用avro文件)时会发生这个错误。例如,当您在外部使用sbt构建项目,然后使用IntelliJ ->发生class already defined错误(或is not a member of package错误)。在这种情况下:您需要首先在外部运行sbt clean compile,然后转到步骤#1。

当您错误地将src/main/任何其他文件夹作为源根文件夹时,会发生这种情况。请检查是否有这样的情况。如果是,则右键单击取消标记。然后在你的groupId开始的上一级循环。假设你的包是com.company.test,而com可能位于java或scala下,然后右键单击它(java/scala),然后将其标记为源根。

在我的例子中,问题是protobuf Idea插件:

  1. 删除probuf插件
  2. 密切主意
  3. 删除所有与idea相关的文件夹。
  4. 打开Idea并重新导入项目

相关内容

最新更新