如何有效地多次运行Scala程序?

时间:2019-04-24 14:33:38

标签: scala sbt

我有一个使用sbt构建的scala程序,我想使用另一个程序(用rust编写)使用不同的参数多次运行它。

我每次都可以打电话给sbt run [arg],但这很慢。通常一个人会使用sbt shell并多次调用run [arg],但是我不知道该脚本是否或如何工作。另外,我想检索程序的输出,但不包括sbt的输出。

我尝试使用sbt packagescala program.jar,但事实是我没有安装这样的scala二进制文件,无论如何,我想使用sbt下载的本地scala版本,而不是系统全局版本。我不知道如何使用此本地Scala版本运行program.jar

我还考虑过将scala程序作为rust程序的子进程来运行,通过stdin和stdout或其他某种方式进行多次通信。

在提供输入和检索输出的同时多次运行我的Scala程序的干净有效的方法是什么?

2 个答案:

答案 0 :(得分:3)

还有另一个方便的sbt插件,可让您根据目标平台sbt-native-packager

打包应用程序

这是将其打包为通用zip文件的方式:

在您project/plugins.sbt中(根据需要创建),添加

addSbtPlugin("com.typesafe.sbt"    % "sbt-native-packager"   % "1.3.3")

并通过添加以下内容,将插件启用到您的build.sbt中:

enablePlugins(JavaAppPackaging)

然后您可以运行以下命令:

sbt universal:packageBin

将一个压缩文件放在target/universal下。 您可以解压缩zip文件并在bin文件夹下运行脚本:

./target/universal/hello-0.1.0-SNAPSHOT/bin/hello -- "My arg1" "My arg2

请注意,--允许将参数传递给您的程序。 这个插件允许您根据目标平台创建不同的格式,例如deb文件,docker映像,dmg文件等。 您可以阅读有关sbt-native-packager here的更多信息。

答案 1 :(得分:2)

命令sbt run仅用于开发目的。要运行您的应用,您需要将其打包到jar

您可以使用sbt package创建jar,但是创建的jar将不包含任何外部依赖项。您需要将它们手动添加到classpath。因此,您需要使用-cp参数运行jar,并指定要使用的所有jars(包括项目jar),并为您的主类提供完全限定的名称:

java -cp yourprojectname.jar:external.jar:anotherexternal.jar:. your.package.Main <your args>

正如Travis所写,更简单的方法是创建一个可运行的jar,其中将包含您的所有依赖项。您可以使用sbt-assembly插件轻松做到这一点。

只需将addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9")添加到项目目录中的文件project/assembly.sbt中,然后运行sbt assembly。 在target/scala_X.X.X目录中将显示名称为projectname-assembly-X.X.X.jar的文件,您可以使用以下文件运行该文件:

java -jar projectname-assembly-X.X.X.jar <your args>