一些 ScalaTests 不 运行 来自 IDEA - NoSuchMethodError
Some ScalaTests do not run from IDEA - NoSuchMethodError
我有一个奇怪的问题:有时 ScalaTests 在 IDEA 中失败。我得到的是:
An exception or error caused a run to abort. This may have been caused by a problematic custom reporter.
java.lang.NoSuchMethodError: scala.runtime.ObjectRef.create(Ljava/lang/Object;)Lscala/runtime/ObjectRef;
at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:2347)
at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter.apply(Runner.scala:1044)
at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter.apply(Runner.scala:1043)
at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:2722)
at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1043)
at org.scalatest.tools.Runner$.run(Runner.scala:883)
at org.scalatest.tools.Runner.run(Runner.scala)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:138)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
其他有同样问题的人应该设置一个选项"run worksheet in the compiler process",但我在我的IDEA中找不到它。我没有文件 -> 设置 -> Scala 它应该在的地方。
我该怎么办?
编辑:我调查了更多,真正奇怪的是:它是一个多模块 SBT 构建,在某些项目中测试有效。我创建了一个新模块,添加了一个非常简单的测试并运行了该测试。只有一个模块中的测试因此错误而失败。
EDIT2:这似乎是捆绑的 SBT 编译器中的一个错误,请参阅 this link. 我现在清理了我的目录,删除了我的 .ivy2
文件夹并尝试重新导入所有内容,看看这是否有任何改变。
我找到了原因。确实是IDEA的Scala插件的工作原理。我的项目之前基于 Scala 2.11,我将其切换为使用 2.10,因为我使用为 Scala 2.10 构建的 Spark 添加了子模块,不知何故 IDEA 仍然选择 Scala 2.11 依赖项进行测试,即使我的整个项目现在使用 2.10。
我删除了我的 .ivy2
文件夹,用 git clean -fdx
清理了我的项目,然后将所有内容重新导入到 IDEA 中,但是这次,我没有使用内置的 SBT,而是我使用的那个而是安装在我的电脑上。现在好像可以用了。
所以根据经验,在进行非常根本的更改时,我会核对 .ivy2
并在将来从头开始重新导入所有内容。
这可能是因为您的应用程序和 SBT 运行 使用了不同版本的 Scala。
当您将 SBT 项目导入 IDEA 时,它会为您创建两个模块:com-example-yourapp 和 com-example-yourapp-build。
IDEA 将所有 SBT 的库(包括 Scala)添加到 *-build 项目的依赖项中。
问题是 IDEA 出于某种原因首先在类路径中添加了 SBT 的 Scala 版本,因此你的测试 运行s 使用它。
修复:
- 打开 *-build 项目的依赖项。
- 双击 'SBT: sbt-and-plugins' 库。
- 从库中删除 Scala 的 lib jar(scala-library.jar 等)。
现在应该可以了。
版本不匹配。检查你安装的scala版本和pom依赖版本。
我有一个奇怪的问题:有时 ScalaTests 在 IDEA 中失败。我得到的是:
An exception or error caused a run to abort. This may have been caused by a problematic custom reporter.
java.lang.NoSuchMethodError: scala.runtime.ObjectRef.create(Ljava/lang/Object;)Lscala/runtime/ObjectRef;
at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:2347)
at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter.apply(Runner.scala:1044)
at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter.apply(Runner.scala:1043)
at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:2722)
at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1043)
at org.scalatest.tools.Runner$.run(Runner.scala:883)
at org.scalatest.tools.Runner.run(Runner.scala)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:138)
at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
其他有同样问题的人应该设置一个选项"run worksheet in the compiler process",但我在我的IDEA中找不到它。我没有文件 -> 设置 -> Scala 它应该在的地方。
我该怎么办?
编辑:我调查了更多,真正奇怪的是:它是一个多模块 SBT 构建,在某些项目中测试有效。我创建了一个新模块,添加了一个非常简单的测试并运行了该测试。只有一个模块中的测试因此错误而失败。
EDIT2:这似乎是捆绑的 SBT 编译器中的一个错误,请参阅 this link. 我现在清理了我的目录,删除了我的 .ivy2
文件夹并尝试重新导入所有内容,看看这是否有任何改变。
我找到了原因。确实是IDEA的Scala插件的工作原理。我的项目之前基于 Scala 2.11,我将其切换为使用 2.10,因为我使用为 Scala 2.10 构建的 Spark 添加了子模块,不知何故 IDEA 仍然选择 Scala 2.11 依赖项进行测试,即使我的整个项目现在使用 2.10。
我删除了我的 .ivy2
文件夹,用 git clean -fdx
清理了我的项目,然后将所有内容重新导入到 IDEA 中,但是这次,我没有使用内置的 SBT,而是我使用的那个而是安装在我的电脑上。现在好像可以用了。
所以根据经验,在进行非常根本的更改时,我会核对 .ivy2
并在将来从头开始重新导入所有内容。
这可能是因为您的应用程序和 SBT 运行 使用了不同版本的 Scala。 当您将 SBT 项目导入 IDEA 时,它会为您创建两个模块:com-example-yourapp 和 com-example-yourapp-build。 IDEA 将所有 SBT 的库(包括 Scala)添加到 *-build 项目的依赖项中。 问题是 IDEA 出于某种原因首先在类路径中添加了 SBT 的 Scala 版本,因此你的测试 运行s 使用它。
修复:
- 打开 *-build 项目的依赖项。
- 双击 'SBT: sbt-and-plugins' 库。
- 从库中删除 Scala 的 lib jar(scala-library.jar 等)。
现在应该可以了。
版本不匹配。检查你安装的scala版本和pom依赖版本。