Scala jvm选项未传递给分叉进程

Scala jvm选项未传递给分叉进程,scala,jvm,sbt,Scala,Jvm,Sbt,根据文档,sbt分叉进程应该接收当前进程的jvm设置: 默认情况下,分叉进程使用与当前进程的构建、工作目录和JVM选项相同的Java和Scala版本。见: 然而,对我来说,情况似乎并非如此。进行以下测试: object Test { def main(args: Array[String]): Unit = { println("Conf: " + System.getProperty("config.resource")) }

根据文档,sbt分叉进程应该接收当前进程的jvm设置:

默认情况下,分叉进程使用与当前进程的构建、工作目录和JVM选项相同的Java和Scala版本。见:

然而,对我来说,情况似乎并非如此。进行以下测试:

object Test {

        def main(args: Array[String]): Unit = {

                println("Conf: " + System.getProperty("config.resource"))
        }
}
如果我使用sbt-Dconfig.resource=test.conf运行这个程序,那么会打印“conf:test.conf”。但一旦我在build.scala中添加fork,run:=true“Conf:null”就会打印出来。这对我来说意味着jvm选项实际上并没有传递给分叉进程。有人能告诉我我错过了什么吗

import sbt._
import Keys._

object Build extends Build {
        lazy val root = (project in file(".")).
        settings(
        fork in run := true
        )
}

如果您要求sbt分叉运行代码的VM,那么它不会继承父VM的系统属性

fork in run := true

fork in console := true

javaOptions in run += s"-Dconfig.resource=${Option(System.getProperty("config.resource")).getOrElse("default")}"

javaOptions in console += s"-Dconfig.resource=${Option(System.getProperty("config.resource")).getOrElse("default")}"

这对我有用

SBT文档是正确的,JVM属性确实会传递给分叉进程。但是,您关心的是需要手动传递的系统属性。尝试此操作以传递所有系统属性:

import scala.collection.JavaConversions._

javaOptions in run += {
  val props = System.getProperties
  props.stringPropertyNames().toList.map { configKey =>
    s"-D$configKey=${props.getProperty(configKey)}"
  }.mkString(" ")
}

当您分叉JVM时,实际上创建了新进程。Sbt不会将JVM参数复制到新进程。您必须明确指定这些,例如:

javaOptions in test += "-Dconfig.file=app.test.conf"
fork in test := true
当您在测试中禁止分叉时,例如:

javaOptions in test += "-Dconfig.file=app.test.conf"
fork in test := true

您的测试正在同一个JVM中运行(使用它的参数)。希望这有帮助。

这是我用过的。这是josephpconley的答案的更新版本

  javaOptions ++= {
    val props = sys.props.toList
    props.map {
      case (key, value) => s"-D$key=$value"
    }
  },

这不是我的问题。我想要文档中指定的当前进程的jvm选项。对不起,我一开始误解了这个问题。。。。我编辑了答案以帮助您回答