gpt4 book ai didi

sbt - 如何运行由程序包生成的jar(可能与lib下的其他jar)一起运行?

转载 作者:行者123 更新时间:2023-12-03 10:55:11 32 4
gpt4 key购买 nike

如何运行sbt的.jar生成的package文件?

我用一个.scala源创建了一个非常简单的示例:

package org.pack {
class ScalaParser(files: Array[String]) {
def doAll() = {
println("hello")
}
}

object Main {
def main(args: Array[String]): Unit = {
val sp = new ScalaParser(args)
sp.doAll()
}

}
}

运行后
$ sbt
> compile
> package
.jar/target/scala-<version>中创建。如果我尝试运行它,它将失败并显示以下错误:
$ java -jar package_2.9.2-0.1.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at org.pack.Main.main(Main.scala)
Caused by: java.lang.ClassNotFoundException: scala.ScalaObject
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 13 more

请注意,没有使用任何外部库,并且 sbt compile run可以正常工作。

我附上了 the whole project including generated .jar on dropbox

真正奇怪的是 .jar list 包含要加载的正确类,即 org.pack.Main。可能是其他原因引起的。

系统信息
$ java -version
java version "1.7.0_55"
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)

$ scala -version
Scala code runner version 2.9.2 -- Copyright 2002-2011, LAMP/EPFL

附加问题-如果我在 .jar中有一些外部 /lib怎么办?我如何保证它们包装好?我需要在每个JVM上运行一个 .jar(可能)。

感谢帮助。

最佳答案

您可以使用sbt插件sbt-assembly:

sbt-assembly> = 0.12.0且sbt> = 0.13.6

由于sbt-assembly现在是一个自动插件,因此只需将project / assembly.sbt添加到您的sbt项目即可:

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

sbt组装0.11

将project / assembly.sbt添加到您的sbt项目中:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")

也添加assembly.sbt:
import AssemblyKeys._ // put this at the top of the file

assemblySettings

用法

这为您提供了另一个sbt命令:
sbt assembly

生成一个“胖子”(包括所有依赖项,包括Scala库)。

现在您可以启动程序

java -cp .../package-assembly.jar



因此,您仅需要Java安装和“ fat jar ”即可。

关于sbt - 如何运行由程序包生成的jar(可能与lib下的其他jar)一起运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24238060/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com