我有一个使用sbt构建的scala程序,我想使用另一个程序(用rust编写)使用不同的参数多次运行它。
我每次都可以打电话给sbt run [arg]
,但这很慢。通常一个人会使用sbt shell并多次调用run [arg]
,但是我不知道该脚本是否或如何工作。另外,我想检索程序的输出,但不包括sbt的输出。
我尝试使用sbt package
和scala program.jar
,但事实是我没有安装这样的scala
二进制文件,无论如何,我想使用sbt下载的本地scala版本,而不是系统全局版本。我不知道如何使用此本地Scala版本运行program.jar
。
我还考虑过将scala程序作为rust程序的子进程来运行,通过stdin和stdout或其他某种方式进行多次通信。
在提供输入和检索输出的同时多次运行我的Scala程序的干净有效的方法是什么?
答案 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>