无法运行从scala文件

时间:2015-06-02 07:24:47

标签: scala jar build sbt

这是我用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

问题:我做错了什么?我希望我的问题清楚。如果有一些混乱,那么请问。提前谢谢。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

所描述的过程证明有效,直到执行jar文件的方式。从cat a.txt | perl -ne 's/^"//; s/"$//; @items = split /","/; print join("|", @items);' 尝试使用

运行它
target/scala-2.11

检查它是否也可以从包含scala hello-world_2.11-1.0.jar 的项目根文件夹运行。

答案 2 :(得分:0)

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

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

此命令将依赖包含scala-library.jar,如果它具有def main(args:Array[String])方法,也会将TestApp识别为主类。请注意,多个jar文件应该用分号(“;”)

分隔

答案 3 :(得分:0)

我们可以使用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,然后在target/scala-2.12/路径中创建jar文件。

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

sbt-assembly是一个最初从codahale的assembly-sbt移植的sbt插件,我猜这是受Maven的Assembly插件启发的。目标很简单:使用所有依赖项为项目创建一个胖JAR。