当前位置:  开发笔记 > 编程语言 > 正文

为什么Scala + Intellij + ScalaTest + Scalactic中的"无法找到隐式"错误,而不是来自sbt

如何解决《为什么Scala+Intellij+ScalaTest+Scalactic中的"无法找到隐式"错误,而不是来自sbt》经验,为你挑选了2个好方法。

我有这个代码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中的示例



1> angelcervera..:

响应底部的变通方法.;)

此问题与此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/



2> Justin Kaese..:

有些依赖项可能在编译范围内包含不兼容的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")

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有