执行 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 文件

假期学习进度十三

2020寒假生活学习日记

sbt 无法为 scala 版本 2.11.12 创建 jar

如何使用 scala sbt 构建多个 jar 文件

运行使用 SBT 和 ProGuard 构建的独立 jar 时出现 AbstractMethodError