我有一个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/src
和myproject/src/main/scala
都被标记为Source。因此,由于上述错误,IntelliJ无法构建myproject/src/main/scala
。取消标记源码从myproject/src
(在IntelliJ,文件>项目结构,选择我的项目模块,选择src文件夹在源选项卡,在"添加内容根"窗格)解决了这个问题。
这意味着在您的类路径中有两个具有相同包和类名的编译类。一个由sbt编译,一个由IntelliJ编译。
应该可以解决这个问题:
- 尝试用sbt-idea生成IntelliJ .iml文件,而不是直接导入。
- 在IntelliJ中单击Build -> Rebuild之前先清除
- 当用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
的其他文件吗?
-
你可以试着把它重命名为其他东西,看看是否有效
-
如果你想保持相同的名称,你可以把它们放在单独的包中。
-
或者将它们放在不同的封装对象中
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):
-
File -> Project Structure
-
Project Settings -> Modules
- 现在我们需要修复"source"文件。我在每个模块中搜索
target/scala-2.12/src_managed
,并将其标记为"源目录"(蓝色)。 - 在所有模块中未标记所有其他路径,如
target/scala-2.12/*
(在我的情况下是target/scala-2.12/src_managed/main/compiled_avro
)。作为我项目中的一个例子,我只在其中一个模块中留下了这些源:target/scala-2.12/src_managed
,src/main/scala
。 - 保存更改并重新构建项目。
补充:哦,看起来有时当你在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插件:
- 删除probuf插件
- 密切主意
- 删除所有与idea相关的文件夹。
- 打开Idea并重新导入项目