为什么在 Scala + Intellij + ScalaTest + Scalactic 中出现 "could not find implicit" 错误而不是来自 sbt

Why "could not find implicit" error in Scala + Intellij + ScalaTest + Scalactic but not from sbt

我有这段代码 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 不能解决问题 - 重现错误的示例:Example in Github

响应底部的解决方法。 ;)

此问题与此 BUG 列表相关:

问题是项目中有依赖项正在使用,using test scope,其他版本的scalatest和scalactic。

IntelliJ Idea 正在混合编译范围和测试范围,但 SBT 工作正常。 IntelliJ Idea团队在BUG中表示他们正在做这方面的工作

目前,我的解决方法已转移到其他库用于测试的旧版本。

备注:

@justin-kaeser is assigned and working to fix this. Thx!

A lot of improvement related to the Scala plugin in that latest previews.

Example to reproduce the error : https://github.com/angelcervera/idea-dependencies-bug

一些解决方法:

  1. 从项目结构 -> 模块中删除有问题的依赖项
  2. 排除 sbt 中的库。
  3. 使用相同的版本。
  4. 尝试使用最后一个 EAP:https://www.jetbrains.com/idea/nextversion/

可能某些依赖项在编译范围内传递了不兼容的 Scalactic 或 Scalatest 版本,这些版本也包含在测试范围内。

您可以在项目设置/模块/依赖项选项卡下的项目结构中检查它,并使用 sbt-dependency-graph 插件更仔细地分析它。

SBT 会执行 IntelliJ 不会执行的依赖项逐出 (issue),这在从 IDE 编译时可能会导致其他问题。如果 sbt-dependency-graph 显示冲突的版本被逐出,则可能是此问题的一个实例。

解决方法:当您发现有问题的传递依赖项时,将其从 build.sbt 中的根依赖项中排除。例如:

"org.apache.spark" %% "spark-core" % "2.1.0" % "provided" exclude("org.scalatest", "scalatest_2.11")

不确定这是否是 IDE 错误,但对我来说,将 IDE 升级到最新版本并没有任何帮助。在这里浪费了几个小时后,我解决了这个错误。以下是哪些状态。

could not find implicit value for parameter prettifier: org.scalactic.Prettifier

解决方案:

In IntelliJ press Ctrl+Alt+Shift+S -> Modules -> Dependencies -> Search for 
org.scalactic:3.0.0.jar (Test scope) and most probably there would be 
another version as 2.x.x in compile scope. Right click on 2.x.x and select 
EDIT and then choose the 3.0.0 version in compile scope, and apply new 
settings.

P.S. Depending on your case there may be only one entry but make sure you 
use 3.0.0 in compile scope to get rid of that weird error.

我有类似的问题。

对我来说,解决这个问题的最简单方法就是删除 .idea 文件夹并重新导入项目。

issue 170 中所述,这可能是 混合 spark-testing-base 依赖性 的问题。

确保您没有混合依赖关系

我有以下依赖项

libraryDependencies ++= Seq(
  "org.apache.spark" % "spark-core_2.11" % "2.1.0",
  "org.apache.spark" % "spark-sql_2.11" % "2.1.0",
  "org.apache.spark" % "spark-streaming_2.11" % "2.1.0",
  "org.apache.spark" % "spark-mllib_2.11" % "2.1.0",
  "com.holdenkarau" %% "spark-testing-base" % "2.1.0_0.8.0" % "test",
  "org.scalatest" % "scalatest_2.11" % "2.1.0" % "test",
  "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0",
  "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0" classifier "models"
)

当我尝试 运行 测试 类 我得到

Error:(32, 14) could not find implicit value for parameter pos: org.scalactic.source.Position test("lsi"){ Error:(32, 14) not enough arguments for method test: (implicit pos: org.scalactic.source.Position)Unit. Unspecified value parameter pos. test("lsi"){ ..........

然后我将依赖项更改为

libraryDependencies ++= Seq(
  "org.apache.spark" % "spark-core_2.11" % "2.2.0",
  "org.apache.spark" % "spark-sql_2.11" % "2.2.0",
  "org.apache.spark" % "spark-streaming_2.11" % "2.2.0",
  "org.apache.spark" % "spark-mllib_2.11" % "2.2.0",
  "com.holdenkarau" %% "spark-testing-base" % "2.2.0_0.8.0" % "test",
  "org.scalatest" % "scalatest_2.11" % "2.2.2" % "test",
  "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0",
  "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0" classifier "models"
)

Re-imported 我的项目干净且打包无效

并且测试 类 通过了。

还要确保您的项目 JDK 设置为 JDK 8。 Scala 与 JDK 11 不兼容,这是 IntelliJ 现在的默认值。

Maven 也发生了同样的情况。

我有一个项目,一切正常。在最新的 IntelliJ 升级后,它忘记了 JDK 设置。我完成了答案中的所有步骤,但其中 none 有帮助。作为最后的手段,我从头开始重新安装了 IntelliJ,检查了一个干净的 repo(没有 .idea 文件夹或 .iml 文件)并且......没有帮助。然后在再次设置项目的过程中,我注意到 JDK 11。它给我敲响了警钟,添加了 JDK 8,然后就可以了。测试又变绿了。

sbt 文件中的以下更改解决了 IntelliJ 中的编译问题

"org.apache.spark" %% "spark-core" % "2.1.0" % "provided" exclude("org.scalatest", "scalatest_2.11")

代码浏览器仍在显示

No implicit arguments of type org.scalactic.Prettifier.

但是,经过上述修复后,测试在 IntelliJ 中正常运行。