【发布时间】:2022-02-02 06:06:32
【问题描述】:
我正在使用一个相当新的 SBT 版本(似乎很难弄清楚这个版本是什么)。我想使用sbt run 将系统属性传递给我的应用程序,如下所示:
sbt -Dmyprop=x run
我该怎么做?
【问题讨论】:
标签: sbt
我正在使用一个相当新的 SBT 版本(似乎很难弄清楚这个版本是什么)。我想使用sbt run 将系统属性传递给我的应用程序,如下所示:
sbt -Dmyprop=x run
我该怎么做?
【问题讨论】:
标签: sbt
SBT 的运行程序通常不会创建新进程,因此如果您想设置传递的参数,您还必须告诉它这样做。您可以在构建设置中添加如下内容:
fork := true
javaOptions := Seq("-Dmx=1024M")
the SBT documentation 中有更多关于分叉进程的详细信息。
【讨论】:
我找到了将其添加到 build.sbt 的最佳方式:
// important to use ~= so that any other initializations aren't dropped
// the _ discards the meaningless () value previously assigned to 'initialize'
initialize ~= { _ =>
System.setProperty( "config.file", "debug.conf" )
}
相关:当这样做以更改加载的类型安全配置(我的用例)时,还需要手动包含默认配置。为此,Typesafe 配置建议的 include "application" 还不够,但 include classpath("application.conf") 有效。想提一下,因为其他一些人可能出于完全相同的原因想要覆盖系统属性。
来源:sbt 邮件列表上的discussion
【讨论】:
javaOptions后你还fork一个单独的JVM吗?
感谢您的指点,这实际上帮助我解决了一个与 Scala 测试相关的问题。
原来sbt确实在有子项目时分叉测试(请参阅我的code)并且某些测试无法获取系统属性。
所以在sbt -Dsomething="some value" test 中,当在系统属性中找不到something 时,一些测试会失败(这恰好是我的数据库URI,所以这很重要!)
这让我发疯了,所以我想我会把它贴在这里以供其他人将来参考(正如@akauppi 正确指出的那样,“其他人”很可能会在几周内成为我!)。
解决方法是将以下内容添加到build.st:
fork in Test := false
【讨论】:
我认为最好是使用 JAVA_OPTS 环境变量:
#update the java options (maybe to keep previous options)
export JAVA_OPTS="${JAVA_OPTS} -Dmyprop=x"
#now run without any extra option
sbt run
【讨论】:
您可以在 sbt 命令的末尾传递系统属性:
sbt run -Dmyprop=x
如果您必须将程序参数传递到阶段,只需在引号后再次传递系统属性即可:
sbt "runMain com.example.MyClass -p param-value" -Dmyprop=x
【讨论】: