【问题标题】:Cannot run jar file created from Scala file无法运行从 Scala 文件创建的 jar 文件
【发布时间】:2015-08-15 21:05:45
【问题描述】:

这是我用 Scala 编写的代码。

object Main extends App {
    println("Hello World from Scala!")
}

这是我的 build.sbt

name := "hello-world"
version := "1.0"
scalaVersion := "2.11.5"
mainClass := Some("Main")

这是我为创建 jar 文件而运行的命令。

sbt package

我的问题是在 target/scala-2.11 中创建了一个名为 hello-world_2.11-1.0.jar 的 jar 文件。但我无法运行该文件。它给了我一个错误说 NoClassDefFoundError

我做错了什么?

【问题讨论】:

    标签: scala jar build sbt


    【解决方案1】:

    它还说 what 类未找到。您很可能不包括scala-library.jar。如果您在命令行中有 Scala 2.11 可用,则可以运行 scala target/scala-2.11/hello-world_2.11-1.0.jarjava -cp "<path to scala-library.jar>:target/scala-2.11/hello-world_2.11-1.0.jar" Main(在 Windows 上使用 ; 而不是 :)。

    【讨论】:

    • 我已将 scala-library.jar 复制到我的根文件夹中。所以现在我正在尝试运行以下命令java -cp scala-library.jar -jar target/scala-2.11/hello-world_2.11-1.0.jar。我遇到了同样的错误。
    • 抱歉,应该是java -cp "scala-library.jar:target/scala-2.11/hello-world_2.11-1.0.jar" Main(请参阅stackoverflow.com/a/15930980/9204,在Windows 上使用; 而不是:)。
    • 是否可以将 scala-library.jar 文件包含到 hello-world jar 文件中?
    • 或者我应该问一个新问题吗?
    【解决方案2】:

    所描述的过程证明是有效的,直到 jar 文件的执行方式。从target/scala-2.11 尝试使用

    运行它
    scala hello-world_2.11-1.0.jar
    

    sbt run检查它是否也可以从项目根文件夹运行。

    【讨论】:

      【解决方案3】:

      要运行包含多个主类的 jar 文件(包含 scala 代码),请使用以下方法

      scala -cp "<jar-file>.jar;<other-dependencies>.jar" com.xyz.abc.TestApp
      

      此命令将负责将 scala-library.jar 包含在依赖项中,并且如果 TestApp 具有 def main(args:Array[String]) 方法,还将将其识别为主类。请注意,多个jar文件要用分号(";")隔开

      【讨论】:

        【解决方案4】:

        我们可以使用sbt-assembly来打包运行应用程序。

        首先,创建或添加插件到project/plugins.sbt

        addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9")
        

        示例build.sbt 如下所示:

        name := "coursera"
        
        version := "0.1"
        
        scalaVersion := "2.12.10"
        mainClass := Some("Main")
        val sparkVersion = "3.0.0-preview2"
        val playVersion="2.8.1"
        
        val jacksonVersion="2.10.1"
        
        libraryDependencies ++= Seq(
          "org.scala-lang" % "scala-library" % scalaVersion.toString(),
          "org.apache.spark" %% "spark-streaming" % sparkVersion,
          "org.apache.spark" %% "spark-core" % sparkVersion,
          "org.apache.spark" %% "spark-sql" % sparkVersion,
          "com.typesafe.play" %% "play-json" % playVersion,
          // https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka-0-10
          "org.apache.spark" %% "spark-streaming-kafka-0-10" % sparkVersion,
          // https://mvnrepository.com/artifact/org.mongodb/casbah
          "org.mongodb" %% "casbah" % "3.1.1" pomOnly(),
          // https://mvnrepository.com/artifact/com.typesafe/config
          "com.typesafe" % "config" % "1.2.1"
        )
        
        assemblyMergeStrategy in assembly := {
          case PathList("META-INF", xs @ _*) => MergeStrategy.discard
          case x => MergeStrategy.first
        }
        

        从控制台,我们可以运行sbt assembly,jar 文件在target/scala-2.12/ 路径中创建。

        sbt assembly 将创建一个胖罐。这是文档的摘录:

        sbt-assembly 是一个 sbt 插件,最初是从 codahale 的 assembly-sbt 移植而来的,我猜它的灵感来自 Maven 的 assembly 插件。目标很简单:创建一个包含所有依赖项的项目的胖 JAR。

        【讨论】:

          猜你喜欢
          • 2011-03-16
          • 1970-01-01
          • 2010-10-22
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多