【问题标题】:NoSuchMethodError when using Scala in R with rscalarscala 在 R 中使用 Scala 时出现 NoSuchMethodError
【发布时间】:2019-04-23 20:13:23
【问题描述】:

我在使用 R 中的 rscala 包调用预编译的 Scala 代码时遇到问题。

我有一个在版本 2.11.12 上运行的 Scala 项目。我用 sbt-assembly 构建了一个胖 jar,并通过 rscala::scala("path-to-jar.jar") 将其提供给 rscala

但是每当我尝试从包中运行任何函数/方法/任何内容时,都会收到以下错误:

java.lang.reflect.InvocationTargetException
java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;
    at myPackage.myClass$.myMethod(myClass.scala:116)
    at $line6.$read$$iw$$iw$$iw$$iw$.$anonfun$res0$1(<console>:16)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.ddahl.rscala.server.Server.$anonfun$invoke$3(Server.scala:305)
    at org.ddahl.rscala.server.Server.wrap(Server.scala:47)
    at org.ddahl.rscala.server.Server.invoke(Server.scala:305)
    at org.ddahl.rscala.server.Server.run(Server.scala:400)
    at org.ddahl.rscala.server.Main$.delayedEndpoint$org$ddahl$rscala$server$Main$1(Main.scala:105)
    at org.ddahl.rscala.server.Main$delayedInit$body.apply(Main.scala:11)
    at scala.Function0.apply$mcV$sp(Function0.scala:39)
    at scala.Function0.apply$mcV$sp$(Function0.scala:39)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
    at scala.App.$anonfun$main$1$adapted(App.scala:80)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at scala.App.main(App.scala:80)
    at scala.App.main$(App.scala:78)
    at org.ddahl.rscala.server.Main$.main(Main.scala:11)
    at org.ddahl.rscala.server.Main.main(Main.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at scala.reflect.internal.util.ScalaClassLoader.$anonfun$run$2(ScalaClassLoader.scala:106)
    at scala.reflect.internal.util.ScalaClassLoader.asContext(ScalaClassLoader.scala:41)
    at scala.reflect.internal.util.ScalaClassLoader.asContext$(ScalaClassLoader.scala:37)
    at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:132)
    at scala.reflect.internal.util.ScalaClassLoader.run(ScalaClassLoader.scala:106)
    at scala.reflect.internal.util.ScalaClassLoader.run$(ScalaClassLoader.scala:98)
    at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:132)
    at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:28)
    at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:27)
    at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:45)
    at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:35)
    at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:34)
    at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:45)
    at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:73)
    at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:92)
    at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:103)
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:108)
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Error in pop(details, transcompileInfo, envir) : Invocation error.

它确实允许我导入它的类和对象,所以它似乎在类路径中,但就是这样。

我的 build.sbt 在包中包含crossScalaVersions := Seq("2.11.12", "2.12.7", "2.13.0-M5")

有什么想法吗?这似乎是一个 scala 版本错误,因为运行 rscala::scalaConfig() 显示它正在使用 scalaFullVersion 2.12.8,但我似乎无法选择 scala 安装,所以我真的不能指望这是问题。

编辑:

在 Jasper-M 的建议下,我设置了环境变量RSCALA_SCALA_MAJORVERSION=2.11 并使用rscala::scalaConfig(download='scala') 重新执行了配置。现在它以2.11 的形式返回scalaMajorVersion

现在,当我使用 rscala::scala() 创建 scala 桥的实例时,它会返回一条消息(不是错误)说:

cat: /release: No such file or directory

如果我运行println(),它会毫无问题地编译。但是,如果我用自己的预编译胖 JAR 实例化 scala 桥并执行任何操作(如 println),它会返回以下错误:

error: error while loading package, class file '$HOME/.rscala/scala/lib/scala-library.jar(scala/reflect/package.class)' is broken
(class java.lang.RuntimeException/Scala class file does not contain Scala annotation)
error: error while loading package, class file '$HOME/.rscala/scala/lib/scala-library.jar(scala/package.class)' is broken
(class java.lang.RuntimeException/Scala class file does not contain Scala annotation)
error: error while loading package, class file '$HOME/.rscala/scala/lib/scala-library.jar(scala/reflect/package.class)' is broken
(class java.lang.RuntimeException/Scala class file does not contain Scala annotation)
error: error while loading package, class file '$HOME/.rscala/scala/lib/scala-library.jar(scala/package.class)' is broken
(class java.lang.RuntimeException/Scala class file does not contain Scala annotation)
error: error while loading Predef, class file '$HOME/.rscala/scala/lib/scala-library.jar(scala/Predef.class)' is broken
(class java.lang.RuntimeException/Scala class file does not contain Scala annotation)

我在这里真的一无所知。有什么想法吗?

【问题讨论】:

  • 你能在build.sbt中显示你的依赖关系吗?
  • 为什么要针对多个 Scala 版本? Spark 安装只有一个。它是 2.11 (Spark =2.4)。 “软件包要求”是什么意思?
  • 我不是真的,但文档建议使用 crossScalaVersion 进行编译,可能是因为这个兼容性问题。

标签: r scala


【解决方案1】:

这绝对是 Scala 版本错误。

我最好的猜测是您必须设置环境变量 RSCALA_SCALA_MAJORVERSION=2.11 。例如。通过调用

Sys.setenv(RSCALA_SCALA_MAJORVERSION = "2.11")

然后运行

rscala::scalaConfig(download = "scala")

【讨论】:

  • 谢谢。我会试试看它是否有效。确实有道理。
  • 我认为我们已经接近让它发挥作用了。 scalaConfig() 现在返回 scalaMajorVersion2.11,这很棒。我之前尝试过直接更改文件,但没有奏效。设置环境变量如您所说。然而,现在,当我尝试使用rscala::scala() 创建网桥时,它会打印出cat: /release: No such file or directory,但仍然有效。但是,如果我导入我的 JAR,它会中断说 error: error while loading package, class file '$HOME/.rscala/scala/lib/scala-library.jar(scala/reflect/package.class)' is broken 和其他内容。想法?我会编辑帖子。
  • 有趣的事实。我尝试进行导入,它返回了一个巨大的日志,最后有一句有趣的话:Error in rbyte(socketIn) : Scala seems to have died.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多