java.lang.NoSuchMethodError:scala.Predef$.refArrayOps
我有以下课程:java.lang.NoSuchMethodError:scala.Predef$.refArrayOps,scala,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) } } 具有以下单元测
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测试时
我得到以下错误:
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"
我不知道是什么原因造成的。我的类和单元测试似乎很简单。有什么想法吗?
scalatest_2.11
是scalatest的版本,仅与Scala 2.11.x兼容。编写libraryDependencies+=“org.scalatest”%%“scalatest”%%“3.0.0”%%“test”
(注意%%
)以自动选择正确的版本并切换到Scala 2.11.8,直到scalatest_2.12
发布(应该很快)。有关详细信息,请参阅。尝试将以下行添加到build.sbt
您的build.sbt应如下所示:
libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.1"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"
根据我的经验,如果在
build.sbt
中匹配scalatest
版本和scala
版本后仍然出现错误,则必须考虑机器上运行的实际scala版本。
您可以通过$scala
查看
欢迎使用Scala 2.12.1(Java热点(TM)64位服务器虚拟机,Java 1.8.0121)。
键入要计算的表达式。或者尝试:帮助。
这类消息。
您需要匹配此Scala版本(例如这里的
2.12.1
)和build.sbt
的版本。我使用了IntelliJ,然后再次导入项目。
我的意思是,关闭打开的项目并作为Maven或SBT导入。
注意:我选择mvn(自动导入Maven项目)
它消失了
我在全局库中使用了不同版本的Scala(IntelliJ IDEA)的SDK。
文件->项目结构->全局库->删除SDK->重建。它为我修复了一个异常。在eclipse ide中,项目倾向于使用scala安装的“最新2.12捆绑包(动态)”配置进行预选。如果您实际上没有在Scala项目中使用2.12,并且您试图通过IDE运行项目,那么这个问题就会显现出来
我还注意到,如果我用sbt命令“eclipsewithsource”重建我的eclipse项目,这会产生副作用,将eclipse项目scala安装重置回2.12设置(即使我的build.sbt文件配置为scala的2.11版本)。因此,请注意这两种情况。当您使用Spark、Hadoop、Scala和java时,会出现一些不兼容。您可以使用与其他版本兼容的每个版本。我使用Spark版本:2.4.1、Hadoop:2.7、java:9.0.1和Scala:2.11.12
它们彼此兼容。在我的例子中,Spark版本使其不兼容。
对Spark 2.4.0的更改对我来说很有用。这在DataBricks中发生在我身上。这个问题和前面的回答中提到的一样,与spark和scala版本不兼容。对于DataBricks,我必须更改集群DataBricks的运行时版本。默认值是Scala 2.11/Spark 2.4.5,将其至少提升到Scala 2.12/Spark 3.0.0 单击群集>群集名称>编辑>DataBricks运行时版本
在我的例子中,我有一个依赖于不同版本scala的项目jar。这是在项目结构->模块->(所选项目)->依赖项选项卡下找到的。项目中的所有其他内容及其库都在scala版本(2.12)中排列,但另一个jar隐藏了对较旧版本(2.11)的可传递依赖关系。当您使用scala 2.11为scala 2.12项目编译的scala jar文件时,会发生此错误 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文件,则%%
操作符将不会帮助您。查看火花释放,例如:
此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”
交叉标度偏差:=序号(“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文件的库遵循类似的交叉编译流程。我正在使用ApacheSpark-3.1.1和ApacheIgnite-2.10进行PoC,并尝试将数据从Spark加载到ignite集群。但在保存数据时,我得到以下错误
libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.1"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"
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()