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

У меня есть следующий класс:

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)
  }

}

Что имеет следующий unit test:

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")
  }

}

Когда я запускаю 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;

Определения сборки:

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"

Я не могу понять, что вызывает это. Мой класс и unit test кажутся достаточно простыми. Любые идеи?

Ответ 1

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.

Ответ 2

У меня был SDK в глобальных библиотеках с другой версией Scala (IntelliJ IDEA).
Файл → Структура проекта → Глобальные библиотеки → Удалить SDK → Перестроить. Исправлено исключение для меня.

Ответ 3

Я использовал IntelliJ и снова импортировал проект. Я имею в виду, закройте открытый проект и импортируйте его как Maven или SBT. Примечание. Я выбираю mvn (автоматически импортирует проекты Maven) Это исчезло.

Ответ 4

По моему опыту, если вы по-прежнему получаете ошибки после сопоставления версии scalatest и scala в build.sbt, вам нужно подумать о своей фактической версии scala, которая запущена на вашем компьютере. Вы можете проверить его на $ scala, увидев

Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_121). Type in expressions for evaluation. Or try :help. этот тип сообщений. Вам нужно сопоставить эту версию scala (например, 2.12.1 здесь) и build.sbt one.

Ответ 5

Попробуйте добавить следующую строку в ваш build.sbt

libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"

ваш build.sbt должен быть таким:

libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.1"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"

С этим ошибка для меня решена.

Ответ 6

в eclipse ide проект имеет тенденцию быть предварительно выбранным с установкой scala "Последняя конфигурация пакета 2.12 (динамическая)". Если вы фактически не используете 2.12 для своего проекта scala и пытаетесь запустить свой проект через среду IDE, тогда эта проблема проявится.

Я также заметил, что если я перестрою проект eclipse с помощью команды sbt: "eclipse with-source", это имеет побочный эффект сброса установки проекта eclipse scala обратно в настройку 2.12 (хотя моя сборка .sbt файл настроен для версии 2.11 Scala). Поэтому будьте в курсе обоих этих сценариев.

Ответ 7

Когда вы используете Spark, Hadoop, Scala и java, возникают некоторые несовместимости. Вы можете использовать версию каждого, которая совместима с другими. Я использую версию Spark: 2.4.1, Hadoop: 2.7, java: 9.0.1 и Scala: 2.11.12, они совместимы друг с другом.

Ответ 8

В моем случае версия Spark делает ее несовместимой. Смена на Spark 2.4.0 у меня работает.