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 у меня работает.