【问题标题】:java.lang.NoSuchMethodError in Scala SBT Shell after executing JAR [duplicate]执行 JAR 后 Scala SBT Shell 中的 java.lang.NoSuchMethodError [重复]
【发布时间】: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 执行失败。

【问题讨论】:

    标签: scala build sbt packaging


    【解决方案1】:

    错误很简单。当您运行package 时,您会创建一个JAR,其中仅包含与您的源代码对应的类,仅此而已。而且您的代码依赖于 Scala 标准库,因此如果您尝试使用 java - jar 运行它,它将因类路径错误而失败。

    您有 4 个解决方案:

    1. 直接使用scala 运行JAR。但是,您需要使用与编译时相同的主要版本。

    2. 运行时将Scala库jar放到类路径中。这与上面的基本相同。因此,您必须再次使用相同的主要版本。

    3. 使用sbt-assembly创建一个已经包含Scala stdlib(以及任何其他依赖项)的超级jar。

    4. 使用sbt-native-packager创建一个将为您设置一切的本机可分发文件。

    对于本地开发和测试,选项 1 通常是最佳选项。
    对于简单的项目,选项 3 是恕我直言,是最简单的选择。
    对于非常复杂的项目,选项 4 非常受欢迎。

    【讨论】:

    • 好的,我明白了。 1号是。实际上,我确实使用 scala shell 运行了 jar,但它尝试使用 scala 2.13 运行它。我会检查并报告。
    • 因此,在 build.sbt 中定义了与我在笔记本电脑上安装的相同的 scala 版本后,jar 执行工作正常。谢谢!
    猜你喜欢
    • 2019-11-22
    • 2012-10-04
    • 2011-08-26
    • 2015-11-26
    • 2013-08-06
    • 2019-07-16
    • 2014-09-25
    • 2023-03-05
    • 2020-08-07
    相关资源
    最近更新 更多