我有一个scala项目,在命令行中使用SBT时可以编译,运行和测试。但是,在intellij中构建项目时,似乎项目中的每个类在事件日志中都有此错误,导致构建失败:
SendCommandToService is already defined as case class SendCommandToService
case class SendCommandToService(service: String, commandName: String, keys: Array[String], values: Array[String])
^
答案 0 :(得分:97)
对我来说,原因是myproject/src
和myproject/src/main/scala
都标记为来源。因此,由于上述错误,intellij未能构建myproject/src/main/scala
。从myproject/src
取消标记来源(在intellij,文件 - >项目结构中,选择myproject模块,在Sources选项卡中选择src文件夹,在"添加内容根"窗格中从Source中删除它)解决了问题。希望这会有所帮助。
答案 1 :(得分:31)
这意味着在类路径中找到了两个具有相同包和类名的已编译类。一个由sbt编译,一个由IntelliJ编译。
以下其中一项应该能够解决问题:
答案 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插件:
答案 6 :(得分:0)
在 sbt compile 之后,我必须将文件夹标记为 Generated Sources Root ,因为我需要这些文件进行编译。
答案 7 :(得分:0)
如果其他人犯了这个初学者的错误,我将添加我的列表:我暂时通过cp Foo.scala Foo-save.scala
“保存了进度”,而忘记了sbt会尝试编译所有.scala
目录中的文件。
(我不知道,我想我正在考虑编程语言,其中忽略了任何未明确include
d的文件...)
当然,由于主文件和“临时备份”文件都定义了相同的类……是的。
答案 8 :(得分:0)
您的项目中是否还有其他文件,其中包含SendCommandToService
?
您可以尝试将其重命名为其他名称,看看是否可行
如果要保留相同的名称,可以将它们放在单独的程序包中。
或者将它们放在不同的封装对象中
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
)是不利的。但是我认为,这种额外的构建会导致复制问题