web-dev-qa-db-fra.com

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

J'ai la classe suivante:

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

}

Qui a le test unitaire suivant:

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

}

Quand j'exécute sbt test j'obtiens l'erreur suivante:

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;

Construire des définitions:

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"

Je ne peux pas comprendre ce qui cause ceci. Ma classe et mon test unitaire semblent assez simples. Des idées?

26
octavian

scalatest_2.11 est la version de ScalaTest compatible uniquement avec Scala 2.11.x. Écrivez libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.0" % "test" (note %%) à la place pour choisir automatiquement la version correcte et passer à Scala 2.11.8 jusqu'à ce que scalatest_2.12 soit publié (cela devrait être très bientôt). Voir http://www.scala-sbt.org/0.13/docs/Cross-Build.html pour plus d'informations.

24
Alexey Romanov

J'avais SDK dans les bibliothèques mondiales avec une version différente de Scala (IntelliJ IDEA).
Fichier -> Structure du projet -> Bibliothèques globales -> Supprimer le SDK -> Reconstruire. Cela a corrigé l'exception pour moi.

23
Anton Tkachov

J'ai utilisé IntelliJ et je viens d'importer le projet à nouveau. Je veux dire, fermez le projet ouvert et importez-le en tant que Maven ou SBT . Remarque: je sélectionne le mvn (importer des projets Maven automatiquement) Il a disparu. 

6
HHH

Essayez d’ajouter la ligne suivante à votre build.sbt

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

votre build.sbt devrait être comme ceci:

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

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

Avec cela, l'erreur pour moi est résolue.

0
Yousef Irman

dans Eclipse ide, le projet a tendance à être présélectionné avec la configuration «Latest 2.12 bundle (dynamic)» de l'installation scala. Si vous n'utilisez pas réellement la version 2.12 pour votre projet Scala et tentez de l'exécuter par le biais de l'EDI, ce problème se manifestera.

J'ai également remarqué que si je reconstruisais mon projet Eclipse avec la commande sbt: "Eclipse with-source", cela aurait pour effet secondaire de réinitialiser l'installation de la scala du projet Eclipse au paramètre 2.12 (même si mon fichier build.sbt est configuré pour une version 2.11 de Scala). Alors soyez à l'affût de ces deux scénarios.

0
Andrew Norman