java.lang.NoSuchMethodError:scala.Predef $ .refArrayOps

oct*_*ian 35 scala

我有以下课程:

import scala.util.{Success, Failure, Try}


class MyClass {

  def openFile(fileName: String): Try[String]  = {
    Failure( new Exception("some message"))
  }

  def main(args: Array[String]): Unit = {
    openFile(args.head)
  }

}
Run Code Online (Sandbox Code Playgroud)

其中有以下单元测试:

class MyClassTest extends org.scalatest.FunSuite {

  test("pass inexistent file name") {
    val myClass = new MyClass()
    assert(myClass.openFile("./noFile").failed.get.getMessage == "Invalid file name")
  }

}
Run Code Online (Sandbox Code Playgroud)

当我运行时,sbt test我收到以下错误:

java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;
        at org.scalatest.tools.FriendlyParamsTranslator$.translateArguments(FriendlyParamsTranslator.scala:174)
        at org.scalatest.tools.Framework.runner(Framework.scala:918)
        at sbt.Defaults$$anonfun$createTestRunners$1.apply(Defaults.scala:533)
        at sbt.Defaults$$anonfun$createTestRunners$1.apply(Defaults.scala:527)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
        at scala.collection.immutable.Map$Map1.foreach(Map.scala:109)
        at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
        at scala.collection.AbstractTraversable.map(Traversable.scala:105)
        at sbt.Defaults$.createTestRunners(Defaults.scala:527)
        at sbt.Defaults$.allTestGroupsTask(Defaults.scala:543)
        at sbt.Defaults$$anonfun$testTasks$4.apply(Defaults.scala:410)
        at sbt.Defaults$$anonfun$testTasks$4.apply(Defaults.scala:410)
        at scala.Function8$$anonfun$tupled$1.apply(Function8.scala:35)
        at scala.Function8$$anonfun$tupled$1.apply(Function8.scala:34)
        at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
        at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
        at sbt.std.Transform$$anon$4.work(System.scala:63)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
        at sbt.Execute.work(Execute.scala:235)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
        at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
        at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
[error] (test:executeTests) java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;
Run Code Online (Sandbox Code Playgroud)

构建定义:

version := "1.0"

scalaVersion := "2.12.0"

// https://mvnrepository.com/artifact/org.scalatest/scalatest_2.11
libraryDependencies += "org.scalatest" % "scalatest_2.11" % "3.0.0"
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚是什么原因造成的.我的班级和单元测试看起来很简单.有任何想法吗?

小智 40

我在全局库中使用了不同版本的Scala(IntelliJ IDEA).
文件 - >项目结构 - >全局库 - >删除SDK - >重建.它为我修复了例外.


Ale*_*nov 30

scalatest_2.11是ScalaTest的版本仅与Scala 2.11.x兼容.写libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.0" % "test"(注%%)代替自动选择正确的版本并切换到Scala 2.11.8直到scalatest_2.12发布(它应该很快).有关更多信息,请参见http://www.scala-sbt.org/0.13/docs/Cross-Build.html.

  • ScalaTest现在可用于Scala 2.12. (2认同)

HHH*_*HHH 8

我使用IntelliJ,然后再次导入项目.我的意思是,关闭打开的项目并导入为Maven或SBT.注意:我选择mvn(自动导入Maven项目)它消失了.

  • 或检查您的scala版本,它应与pom.xml或sbt设置相同 (2认同)

Pow*_*ers 8

当您将使用 Scala 2.11 编译的 Scala JAR 文件用于 Scala 2.12 项目时,会出现此错误。

Scala库通常与不同版本的Scala交叉编译,因此不同的项目版本会发布不同的JAR文件到Maven。例如,Scalatest 版本 3.2.3 将单独的 JAR 文件发布到 Maven 到 Scala 2.10、2.11、2.12 和 2.13,如您在此处看到的

许多 Spark 程序员将使用 Scala 2.11 编译的 JAR 文件附加到运行 Scala 2.12 的集群时都会遇到此错误。有关如何将 Spark 项目从 Scala 2.11 迁移到 Scala 2.12 的详细指南,请参阅此处

正如所提到的接受的答案,在指定 Scala 依赖项时应使用 SBT%%运算符,以便您可以自动获取与项目的 Scala 版本相对应的库依赖项(如接受的答案中所述)。如果库依赖项%%没有您正在查找的 Scala 版本的 JAR 文件,则该运算符不会为您提供帮助。以 Spark 版本为例:

火花释放

build.sbt文件将起作用,因为 Spark 3.0.1 有一个 Scala 2.12 版本:

scalaVersion := "2.12.12"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.0.1"
Run Code Online (Sandbox Code Playgroud)

此代码将不起作用,因为 Spark 3.0.1 没有 Scala 2.11 版本:

scalaVersion := "2.12.12"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.0.1"
Run Code Online (Sandbox Code Playgroud)

如果您的库依赖项也经过交叉编译,您可以交叉编译您的项目并为不同的 Scala 版本构建 JAR 文件。Spark 2.4.7 与 Scala 2.11 和 Scala 2.12 交叉编译,因此您可以使用以下代码交叉编译您的项目:

scalaVersion := "2.11.12"
crossScalaVersions := Seq("2.11.12", "2.12.10")
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.7"
Run Code Online (Sandbox Code Playgroud)

sbt +assembly代码将为您的项目构建两个 JAR 文件,一个使用 Scala 2.11 编译,另一个使用 Scala 2.12 编译。发布多个 JAR 文件的库遵循类似的交叉编译工作流程。