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/src
和 myproject/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 clean
,sbt 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
文件.
(我不知道,我想我正在考虑编程语言,其中任何未明确include
d 的文件都会被忽略...)
当然,因为主文件和“临时备份”文件都定义了相同的类......是的。
【讨论】:
【参考方案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“安装”期间因编译器错误而失败,但以其他方式运行