19

我正在使用一个相当新的 SBT 版本(似乎很难弄清楚这个版本是什么)。我想将系统属性传递给我的应用程序,sbt run如下所示:

sbt -Dmyprop=x run

我怎么能那样做?

4

5 回答 5

16

SBT 的运行程序通常不会创建新进程,因此如果您想设置传递的参数,您还必须告诉它这样做。您可以将这样的内容添加到构建设置中:

fork := true

javaOptions := Seq("-Dmx=1024M")

SBT 文档中有更多关于分叉过程的详细信息。

于 2012-04-14T18:53:48.837 回答
10

我找到了将其添加到的最佳方法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 邮件列表的讨论

于 2014-08-18T11:06:35.697 回答
4

感谢您的指点,这实际上帮助我解决了一个与 Scala 测试相关的问题。

事实证明,当有子项目(请参阅我的 代码)并且某些测试无法获取系统属性时,sbt 确实会分叉测试。

因此sbt -Dsomething="some value" test,当无法在系统属性中找到时,某些测试会失败something(这恰好是我的 DB URI,所以这很重要!)

这让我发疯了,所以我想我会把它贴在这里以供其他人将来参考(正如@akauppi 正确指出的那样,“其他人”很可能会在几周内成为我!)。

解决方法是将以下内容添加到build.st

fork in Test := false

于 2016-01-08T09:08:44.563 回答
0

我认为最好是使用 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
于 2018-06-06T09:59:47.700 回答
0

您可以在 sbt 命令的末尾传递系统属性:

sbt run -Dmyprop=x

如果您必须将程序参数传递到阶段,只需在引号后再次传递系统属性:

sbt "runMain com.example.MyClass -p param-value" -Dmyprop=x
于 2022-02-01T22:06:32.883 回答