我有以下课程:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
其中有以下单元测试:
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")
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行时,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;
Run Code Online (Sandbox Code Playgroud)
构建定义:
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"
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚是什么原因造成的.我的班级和单元测试看起来很简单.有任何想法吗?
Ale*_*nov 30
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.
我使用IntelliJ,然后再次导入项目.我的意思是,关闭打开的项目并导入为Maven或SBT.注意:我选择mvn(自动导入Maven项目)它消失了.
当您将使用 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,如您在此处看到的。
许多 Spark 程序员将使用 Scala 2.11 编译的 JAR 文件附加到运行 Scala 2.12 的集群时都会遇到此错误。有关如何将 Spark 项目从 Scala 2.11 迁移到 Scala 2.12 的详细指南,请参阅此处。
正如所提到的接受的答案,在指定 Scala 依赖项时应使用 SBT%%
运算符,以便您可以自动获取与项目的 Scala 版本相对应的库依赖项(如接受的答案中所述)。如果库依赖项%%
没有您正在查找的 Scala 版本的 JAR 文件,则该运算符不会为您提供帮助。以 Spark 版本为例:
该build.sbt
文件将起作用,因为 Spark 3.0.1 有一个 Scala 2.12 版本:
scalaVersion := "2.12.12"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.0.1"
Run Code Online (Sandbox Code Playgroud)
此代码将不起作用,因为 Spark 3.0.1 没有 Scala 2.11 版本:
scalaVersion := "2.12.12"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.0.1"
Run Code Online (Sandbox Code Playgroud)
如果您的库依赖项也经过交叉编译,您可以交叉编译您的项目并为不同的 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"
Run Code Online (Sandbox Code Playgroud)
该sbt +assembly
代码将为您的项目构建两个 JAR 文件,一个使用 Scala 2.11 编译,另一个使用 Scala 2.12 编译。发布多个 JAR 文件的库遵循类似的交叉编译工作流程。
归档时间: |
|
查看次数: |
41277 次 |
最近记录: |