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

Sbt 如何运行由包生成的jar(可能与lib下的其他jar一起运行)?,sbt,Sbt,如何运行sbt的包生成的.jar文件 我用一个.scala源代码创建了一个非常简单的示例: package org.pack { class ScalaParser(files: Array[String]) { def doAll() = { println("hello") } } object Main { def main(args: Array[String]): Unit = {

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

我用一个
.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-
中创建的。如果我尝试运行它,它将失败,并出现以下错误:

$ 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
工作正常

我附上

真正奇怪的是,
.jar
清单包含要加载的正确类,即
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
附加问题-如果我在
/lib
中有一些外部的
.jar
呢?我怎样才能保证它们是打包的?我需要在(可能的)每个JVM上运行一个
.jar

谢谢你的帮助。

试试看

scala package_2.9.2-0.1.jar
更新

在Java中,命令如下所示

java -cp $SCALA_HOME/lib/scala-library.jar -jar  package_2.9.2-0.1.jar
然而,在类路径中,您可能需要添加额外的jar,例如
-cp“jar1.jar:jar2.jar”

您可以使用sbt插件:

sbt组件>=0.12.0,sbt>=0.13.6 由于sbt assembly现在是一个自动插件,因此将project/assembly.sbt添加到您的sbt项目就足够了:

sbt组件0.11 将project/assembly.sbt添加到sbt项目:

同时添加assembly.sbt:

用法 这将为您提供另一个sbt命令:

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

现在你可以开始你的程序了

java-cp…/package-assembly.jar


因此,您只需要安装Java和“fat jar”。

对于那些不希望构建fat jar的人,所有依赖项都将作为成功运行
sbt包的一部分下载。类路径信息存储在
target
目录中的一个文件中,该文件可以传递到
java
命令中

例如:

sbt package
java -cp target/scala-2.11/yourproject.jar:$(cat target/streams/compile/dependencyClasspath/\$global/streams/export) Main

是的,当然,这很好,但是在没有安装scala的情况下,如何在常规JVM上运行它呢?我假设这是可能的,因为java/scala.class文件是相同的,但编译器信息等,或者它们不是?甚至有可能吗?您可以将scala jar放在/lib文件夹中,当您生成fat jar时,它应该将scala库打包在一起,然后您可以在任何地方运行它,而无需安装scalaIn。如果您需要提及记录器和主配置文件:java-Dlogback.configurationFile=dev-logger.xml-Dfile.ending=UTF8-cp$SCALA\u HOME/lib/SCALA-library.jar-jar-package\u 2.9.2-0.1.jar-Dconfig.file=application.com!非常感谢,它工作起来非常简单和好。我将github链接附加到stb assembly上,以供将来的读者@petrbel阅读。请注意,sbt assembly现在是一个自动插件,自上面的答案编写以来,您在sbt中配置它的方式发生了变化。有关最新设置,请参阅;有关从旧版本迁移,请参阅:@Brideau感谢您的提示;我已经相应地修改了答案。你应该仔细查看sbt标签中已有的答案:参见外部sbt in和。
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
import AssemblyKeys._ // put this at the top of the file

assemblySettings
sbt assembly
sbt package
java -cp target/scala-2.11/yourproject.jar:$(cat target/streams/compile/dependencyClasspath/\$global/streams/export) Main