我正在使用一个相当新的 SBT 版本(似乎很难弄清楚这个版本是什么)。我想将系统属性传递给我的应用程序,sbt run
如下所示:
sbt -Dmyprop=x run
我怎么能那样做?
我正在使用一个相当新的 SBT 版本(似乎很难弄清楚这个版本是什么)。我想将系统属性传递给我的应用程序,sbt run
如下所示:
sbt -Dmyprop=x run
我怎么能那样做?
SBT 的运行程序通常不会创建新进程,因此如果您想设置传递的参数,您还必须告诉它这样做。您可以将这样的内容添加到构建设置中:
fork := true
javaOptions := Seq("-Dmx=1024M")
SBT 文档中有更多关于分叉过程的详细信息。
我找到了将其添加到的最佳方法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 邮件列表的讨论
感谢您的指点,这实际上帮助我解决了一个与 Scala 测试相关的问题。
事实证明,当有子项目(请参阅我的 代码)并且某些测试无法获取系统属性时,sbt
确实会分叉测试。
因此sbt -Dsomething="some value" test
,当无法在系统属性中找到时,某些测试会失败something
(这恰好是我的 DB 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