执行 JAR 后 Scala SBT Shell 中的 java.lang.NoSuchMethodError [重复]
Posted
技术标签:
【中文标题】执行 JAR 后 Scala SBT Shell 中的 java.lang.NoSuchMethodError [重复]【英文标题】:java.lang.NoSuchMethodError in Scala SBT Shell after executing JAR [duplicate] 【发布时间】:2020-12-05 19:42:46 【问题描述】:在使用 SBT(版本 1.3.13)打包并执行 Scala 应用程序(build.sbt 版本为 2.12.0,但实际上安装了 2.13.3)后,我收到以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.wrapRefArray([Ljava/lang/Object;)Lscala/collection/mutable/WrappedArray;
at org.example.GreetWorld$.printMessage(GreetWorld.scala:5)
导致错误的源文件GreetWorld.scala
如下所示:
package org.example
object GreetWorld
def printMessage(theMessage:String):Unit =
println(s"$theMessage from me")
调用上述文件的主文件如下所示:
package org.example
object HelloWorld
def main(args: Array[String]) =
GreetWorld.printMessage("Hello")
有人知道根本原因吗?起初我认为这与选择 Java 11 的 SBT shell 有关,但即使将我的 Windows 的 JAVA_HOME 更改为 Java 8,我仍然遇到同样的错误。在 SBT Shell 中编译和运行它可以正常工作。只有 JAR 执行失败。
【问题讨论】:
【参考方案1】:错误很简单。当您运行package
时,您会创建一个JAR,其中仅包含与您的源代码对应的类,仅此而已。而且您的代码依赖于 Scala 标准库,因此如果您尝试使用 java - jar
运行它,它将因类路径错误而失败。
您有 4 个解决方案:
直接使用scala
运行JAR。但是,您需要使用与编译时相同的主要版本。
运行时将Scala库jar放到类路径中。这与上面的基本相同。因此,您必须再次使用相同的主要版本。
使用sbt-assembly创建一个已经包含Scala stdlib(以及任何其他依赖项)的超级jar。
使用sbt-native-packager创建一个将为您设置一切的本机可分发文件。
对于本地开发和测试,选项 1 通常是最佳选项。 对于简单的项目,选项 3 是恕我直言,是最简单的选择。 对于非常复杂的项目,选项 4 非常受欢迎。
【讨论】:
好的,我明白了。 1号是。实际上,我确实使用 scala shell 运行了 jar,但它尝试使用 scala 2.13 运行它。我会检查并报告。 因此,在 build.sbt 中定义了与我在笔记本电脑上安装的相同的 scala 版本后,jar 执行工作正常。谢谢!以上是关于执行 JAR 后 Scala SBT Shell 中的 java.lang.NoSuchMethodError [重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 sbt-assembly 来自单个项目的具有不同外部依赖项的多个可执行 jar 文件