我有这个代码100%来自sbt,执行sbt test
但在Intellij Idea中抛出一个编译错误.
import org.scalatest.{BeforeAndAfter, FunSuite, GivenWhenThen} class SimpleTest extends FunSuite with GivenWhenThen with BeforeAndAfter { test("Simple Test") { Given("Why this error?") assert("ok" === "ok") } }
错误是:
Error:(5, 10) could not find implicit value for parameter pos: org.scalactic.source.Position Given("Why this error?") Error:(5, 10) not enough arguments for method Given: (implicit pos: org.scalactic.source.Position)Unit. Unspecified value parameter pos. Given("Why this error?") Error:(6, 11) could not find implicit value for parameter prettifier: org.scalactic.Prettifier assert("ok" === "ok") Error:(6, 11) macro applications do not support named and/or default arguments assert("ok" === "ok") Error:(6, 11) not enough arguments for macro method assert: (implicit prettifier: org.scalactic.Prettifier, implicit pos: org.scalactic.source.Position)org.scalatest.Assertion. Unspecified value parameters prettifier, pos. assert("ok" === "ok") Error:(4, 23) could not find implicit value for parameter pos: org.scalactic.source.Position test("Simple Test") {
按照建议刷新并重新加载后:
Error:(6, 11) exception during macro expansion: java.lang.NoSuchMethodError: org.scalactic.BooleanMacro.genMacro(Lscala/reflect/api/Exprs$Expr;Ljava/lang/String;Lscala/reflect/api/Exprs$Expr;)Lscala/reflect/api/Exprs$Expr; at org.scalatest.AssertionsMacro$.assert(AssertionsMacro.scala:34) assert("ok" === "ok")
我在用:
IntelliJ IDEA 2016.3.2 Build #IU-163.10154.41, built on December 21, 2016 scalaVersion := "2.11.0", "org.scalactic" %% "scalactic" % "3.0.1" % "test", "org.scalatest" %% "scalatest" % "3.0.1" % "test"
注意: - 使用File -> Invalidate Caches / Restart
不能解决问题 - 重现错误的示例:Github中的示例
响应底部的变通方法.;)
此问题与此BUG列表有关:
SCL-8167
SCL-11083
SCL-8396
SCL-10912
问题是项目中存在依赖关系,使用测试范围,其他版本的scalatest和scalactic.
IntelliJ Idea混合编译范围和测试范围,但SBT正常工作.IntelliJ Idea团队在BUG中表示他们正在为此工作.
目前,我的解决方法已经转移到其他库用于测试的旧版本.
@ justin-kaeser被分配并正在努力解决这个问题.谢谢!
在最新的预览中,Scala插件有很多改进.
重现错误的示例:https://github.com/angelcervera/idea-dependencies-bug
从项目结构 - >模块中删除有问题的依赖项
在sbt中排除库.
使用相同的版本.
尝试使用最后一个EAP:https://www.jetbrains.com/idea/nextversion/
有些依赖项可能在编译范围内包含不兼容的Scalactic或Scalatest版本,这些版本也包含在测试范围内.
您可以在Project Settings/Modules/Dependencies选项卡下的Project Structure中进行检查,并使用sbt-dependency-graph插件更仔细地分析它.
但是,SBT会执行IntelliJ不会(发布)的依赖性驱逐,这会在从IDE进行编译时导致其他问题.如果sbt-dependency-graph显示冲突的版本被逐出,那么它可能就是这个问题的一个实例.
解决方法:当您发现有问题的传递依赖项时,请将其从build.sbt中的根依赖项中排除.例如:
"org.apache.spark" %% "spark-core" % "2.1.0" % "provided" exclude("org.scalatest", "scalatest_2.11")