Intellij 编译失败:“已定义为”

Posted

技术标签:

【中文标题】Intellij 编译失败:“已定义为”【英文标题】:Intellij compile failures: "is already defined as" 【发布时间】:2013-05-28 22:33:22 【问题描述】:

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

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

【问题讨论】:

你试过Build -> Rebuild Project吗? 是的,我试过了。不过还是谢谢。 【参考方案1】:

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

【讨论】:

是的,这发生在我的 Scala+Java 混合项目中。 当我将我的项目从 src 移动到 src/main/scala 时发生这种情况。 我遇到了这个问题,因为我在 SBT 中定义了一个任务来生成源代码; IntelliJ 不知道在编译期间运行它,或者生成的代码在 target/scala-2.11/src_managed 下,所以我不得不手动将它添加为源路径,这样做会错误地标记两个父文件夹和子文件夹作为源,如上所述。 如果文件夹是蓝色的,您就知道它已被标记为源 在我的情况下,这是根本原因,顺便说一句,同时拥有 scala 和 java src 不会在我的 IDE 中导致此错误【参考方案2】:

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

以下方法之一应该可以解决问题:

    尝试使用sbt-idea 生成 IntelliJ .iml 文件,而不是直接导入。 sbt clean before click Build -> Rebuild in IntelliJ 使用 IntelliJ 重建时,确保 sbt 没有运行

【讨论】:

在 IntelliJ 之外使用 SBT 和 Play,支持“sbt clean”,这最终对我有用(尽管有一次我确实降级了 Scala 2.11 --> 2.10.4)。 @JohnLockwood 我仍然有这个问题,我已经禁用了缓存,执行sbt cleansbt compile,但我的简单脚本仍然收到“已定义为对象”。我什至重命名对象,我的 IntellIJ 仍然给我运行前一个对象的选项。【参考方案3】:

我今天在 IntelliJ 2021.2.1 上遇到了这个问题,根据this page 这是 IntelliJ 的 Scala 增量编译器的一些问题,因此解决方案是将“增量类型”从“IDEA”更改为“Zinc”首选项 -> 构建、执行、部署 -> 编译器 -> Scala 编译器

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

我在 Idea 内部和外部都反复遇到过类似的问题:普通 SBT。

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

【讨论】:

【参考方案7】:

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

File > Project Structure > Modules 对于每个模块,请仔细检查 Source Folders 是否仅包含您想要的文件夹,例如src/main/scala,并且不包含任何生成的源(例如target/scala-2.12/src_managed/main

【讨论】:

在删除 src_managed 文件夹时,我的程序可以正常工作,但是会导致很多红色代码【参考方案8】:

您的项目中是否还有其他带有SendCommandToService 的文件?

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

    如果你想保持相同的名字,你可以把它们放在不同的包中。

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

object traitdemo
 object Ex1
   ...
  

object otherdemo
  object Ex1 
    ...
   

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

【讨论】:

【参考方案9】:

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

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

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

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

【讨论】:

【参考方案10】:

File -> Invalid Caches/Restart 对我有用。这里的所有其他答案都没有。

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

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

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

【讨论】:

【参考方案13】:

就我而言,问题在于 protobuf Idea 插件

    删除idea protbuf插件。 关闭创意 删除所有与idea相关的文件夹(.idea和.idea_modules) 打开 Idea 并再次导入项目。

【讨论】:

以上是关于Intellij 编译失败:“已定义为”的主要内容,如果未能解决你的问题,请参考以下文章

Windows 下 Visual Studio 2012 / Intel 编译器的 C++ 双精度失败

IntelliJ IDEA告诉我“错误:java:编译失败:内部java编译器错误想法”

带有 Java 14 的 IntelliJ 2020.1 中的“记录”预览功能在 Maven“安装”期间因编译器错误而失败,但以其他方式运行

如果没有intelliJ 编译器?

IntelliJ IDEA Spring+Mybatis dao bean对象注入失败

Java 1.8 和 IntelliJ IDEA 14 中的注解编译错误