首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Scala + Intellij + ScalaTest +Scala中“找不到隐式”错误而不是来自sbt

为什么在Scala + Intellij + ScalaTest +Scala中“找不到隐式”错误而不是来自sbt
EN

Stack Overflow用户
提问于 2017-01-10 09:02:53
回答 7查看 7.6K关注 0票数 16

我有这样的代码,它是从sbt 100%运行,执行sbt test,但是在Intellij中抛出一个编译错误。

代码语言:javascript
复制
import org.scalatest.{BeforeAndAfter, FunSuite, GivenWhenThen}

class SimpleTest extends FunSuite with GivenWhenThen with BeforeAndAfter {
  test("Simple Test") {
    Given("Why this error?")
    assert("ok" === "ok")
  }
}

错误是:

代码语言:javascript
复制
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") {

按建议在刷新和重新加载之后:

代码语言:javascript
复制
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")

我正在使用:

代码语言:javascript
复制
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不会修复问题--重现错误的示例:吉特卜的例子

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-01-10 12:07:56

在反应的底部找到解决办法。;)

此问题与以下错误列表有关:

问题是,项目中存在依赖关系,它们使用的是其他版本的scalatest和scalactic,使用的是测试范围。

IntelliJ的思想是将编译范围和测试范围混为一谈,但是它是正确工作的。IntelliJ Idea团队在BUG中说,他们正在处理这个问题。

目前,我的解决办法是使用其他库用于测试的相同的旧版本。

备注:

@贾斯汀-凯瑟被指派并致力于修复这一问题。谢谢! 在最新的预览中,与Scala插件相关的许多改进。 再现错误的示例:https://github.com/angelcervera/idea-dependencies-bug

很少有解决办法:

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

Stack Overflow用户

发布于 2017-01-25 17:54:49

有些依赖项可能是过渡的,在编译范围中包含了不兼容的scope或Scalatest版本,这些版本也包含在测试范围中。

您可以在Project / Modules / Dependencies选项卡下的Project中检查这一点,并使用依赖关系图插件更仔细地分析它。

但是,IntelliJ不执行依赖驱逐(问题),这会在从IDE编译时引起额外的问题。如果sbt依赖关系图显示冲突版本被逐出,那么它可能就是这个问题的一个实例。

解决办法:当您发现冒犯的传递依赖时,将其排除在build.sbt中的根依赖项之外。例如:

代码语言:javascript
复制
"org.apache.spark" %% "spark-core" % "2.1.0" % "provided" exclude("org.scalatest", "scalatest_2.11")
票数 8
EN

Stack Overflow用户

发布于 2017-06-01 13:45:54

不确定这是否是IDE错误,但对我来说,将IDE升级到最新版本并没有任何帮助。在浪费了几个小时之后,这里是我解决这个错误的方法。上面写着。

代码语言:javascript
复制
could not find implicit value for parameter prettifier: org.scalactic.Prettifier

解决办法:

代码语言:javascript
复制
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.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41564915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档