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

时间:2016-10-30 12:16:37

标签: scala

我有以下课程:

@Component(
 { 
    **moduleId: module.id,**
    selector: 'content-page',
    template: '<ng-content></ng-content>' })
export class ContentPage {
}

具有以下单元测试:

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

}

当我运行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;

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

12 个答案:

答案 0 :(得分:32)

我在全球图书馆中使用了不同版本的Scala(IntelliJ IDEA)的SDK 文件 - &gt;项目结构 - &gt;全球图书馆 - &gt;删除SDK - &gt;重建。它修复了我的异常。

答案 1 :(得分:27)

scalatest_2.11是仅与Scala 2.11.x兼容的ScalaTest版本。写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 :(得分:7)

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

答案 3 :(得分:1)

根据我的经验,如果您在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的版本。

答案 4 :(得分:1)

在使用 Spark Hadoop Scala java 时,会出现一些不兼容性。您可以使用彼此兼容的版本。我使用的是 Spark版本:2.4.1 Hadoop:2.7 ,java:9.0.1和Scala:2.11.12 它们彼此兼容。

答案 5 :(得分:1)

就我而言,Spark版本使其不兼容。 更改为Spark 2.4.0适用于我。

答案 6 :(得分:0)

尝试将以下行添加到 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"

有了这个,我的错误就解决了。

答案 7 :(得分:0)

在eclipse ide中,项目倾向于通过scala安装预先选择&#39;最新2.12捆绑(动态)&#39;组态。如果您实际上没有为您的Scala项目使用2.12并且您尝试通过IDE运行项目,则此问题将自行显现。

我还注意到,如果我使用sbt命令重建我的eclipse项目:&#34; eclipse with-source&#34;这有副作用将eclipse项目scala安装重置回2.12设置(即使我的build.sbt文件配置为2.11版本的Scala)。因此,请注意这两种情况。

答案 8 :(得分:0)

这是我在DataBricks中发生的。问题与以前的答案所指出的相同,即与spark和scala版本不兼容。对于DataBrick,我必须更改集群DataBricks运行时版本。默认值为Scala 2.11 / Spark 2.4.5,将其至少提高到Scala 2.12 / Spark 3.0.0

单击“群集”>“ Cluster_Name”>“编辑”>“ DataBricks运行时版本”

enter image description here

答案 9 :(得分:0)

就我而言,我有一个项目jar依赖项,它依赖于不同版本的scala。在项目结构->模块->(选定的项目)->依赖项标签下找到了该文件。该项目及其库中的所有其他内容都以scala版本(2.12)排列,但另一个jar则隐藏了对旧版本(strong)(2.11)的传递依赖。

答案 10 :(得分:0)

当您将使用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,作为you can see here

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

作为接受的答案,在指定Scala依赖项时应使用SBT %%运算符,以便您可以自动获取与项目的Scala版本相对应的库依赖项(如接受的答案中所述)。如果库依赖项没有要查找的Scala版本的JAR文件,那么%%运算符将无济于事。以Spark版本为例:

spark releases

build.sbt文件将可用,因为Spark 3.0.1的Scala 2.12版本:

scalaVersion := "2.12.12"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.0.1"

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

scalaVersion := "2.12.12"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.0.1"

如果您的库依赖项也被交叉编译,则可以交叉编译项目并为不同的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"

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

答案 11 :(得分:0)

我正在使用 Apache Spark-3.1.1 和 Apache ignite-2.10 进行 PoC,并尝试将数据从 spark 加载到 ignite 集群。但是在保存数据时,我收到以下错误。

java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;

我的代码如下:

df.write
            .format(FORMAT_IGNITE)
            .option(OPTION_CONFIG_FILE, CONFIG)
            .option(OPTION_TABLE, "connect")
            .option(OPTION_CREATE_TABLE_PRIMARY_KEY_FIELDS, "id")
            .option(OPTION_CREATE_TABLE_PARAMETERS, "template=replicated").mode(SaveMode.Append)
            .save()