无法 运行 从 Scala 文件创建 jar 文件
Cannot run jar file created from Scala file
这是我用 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
我的问题是在 [=32 处创建了一个名为 hello-world_2.11-1.0.jar 的 jar 文件=].11.但是我无法 运行 该文件。它给我一个错误说 NoClassDefFoundError.
我做错了什么?
它还说找不到什么 class。您很可能没有包括 scala-library.jar
。您可以 运行 scala target/scala-2.11/hello-world_2.11-1.0.jar
如果您可以从命令行或 java -cp "<path to scala-library.jar>:target/scala-2.11/hello-world_2.11-1.0.jar" Main
获得 Scala 2.11(在 Windows 上使用 ;
而不是 :
)。
所描述的过程在执行 jar 文件的方式之前证明是有效的。从 target/scala-2.11
尝试 运行 它与
scala hello-world_2.11-1.0.jar
使用 sbt run
.
检查它是否也可以从项目根文件夹运行
要运行 具有多个主要 classes 的 jar 文件(包含 scala 代码)使用以下方法
scala -cp "<jar-file>.jar;<other-dependencies>.jar" com.xyz.abc.TestApp
此命令将负责将 scala-library.jar 包含在依赖项中,如果它具有 def main(args:Array[String])
方法,还将把 TestApp 识别为主 class。请注意,多个jar文件要用分号(";")
隔开
我们可以使用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
将创建一个 fat jar。这是文档的摘录:
sbt-assembly is a sbt plugin originally ported from codahale's assembly-sbt, which I'm guessing was inspired by Maven's assembly plugin. The goal is simple: Create a fat JAR of your project with all of its dependencies.
这是我用 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
我的问题是在 [=32 处创建了一个名为 hello-world_2.11-1.0.jar 的 jar 文件=].11.但是我无法 运行 该文件。它给我一个错误说 NoClassDefFoundError.
我做错了什么?
它还说找不到什么 class。您很可能没有包括 scala-library.jar
。您可以 运行 scala target/scala-2.11/hello-world_2.11-1.0.jar
如果您可以从命令行或 java -cp "<path to scala-library.jar>:target/scala-2.11/hello-world_2.11-1.0.jar" Main
获得 Scala 2.11(在 Windows 上使用 ;
而不是 :
)。
所描述的过程在执行 jar 文件的方式之前证明是有效的。从 target/scala-2.11
尝试 运行 它与
scala hello-world_2.11-1.0.jar
使用 sbt run
.
要运行 具有多个主要 classes 的 jar 文件(包含 scala 代码)使用以下方法
scala -cp "<jar-file>.jar;<other-dependencies>.jar" com.xyz.abc.TestApp
此命令将负责将 scala-library.jar 包含在依赖项中,如果它具有 def main(args:Array[String])
方法,还将把 TestApp 识别为主 class。请注意,多个jar文件要用分号(";")
我们可以使用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
将创建一个 fat jar。这是文档的摘录:
sbt-assembly is a sbt plugin originally ported from codahale's assembly-sbt, which I'm guessing was inspired by Maven's assembly plugin. The goal is simple: Create a fat JAR of your project with all of its dependencies.