【问题标题】:jvm options not passed on to forked processjvm 选项未传递给分叉进程
【发布时间】:2019-01-23 20:00:26
【问题描述】:

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

默认情况下,分叉进程使用与当前进程的构建、工作目录和 JVM 选项相同的 Java 和 Scala 版本。 请参阅:http://www.scala-sbt.org/0.13/docs/Forking.html

但对我来说似乎并非如此。进行以下测试:

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 := true "Conf: null" 就会打印出来。这对我来说意味着 jvm 选项实际上并没有传递给分叉进程。有人能告诉我我在这里缺少什么吗?

import sbt._
import Keys._

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

【问题讨论】:

    标签: scala jvm sbt


    【解决方案1】:

    SBT 文档是正确的,JVM 属性确实会传递给分叉进程。但是,您担心需要手动传递的 System 属性。试试这个来传递所有系统属性:

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

    【讨论】:

      【解决方案2】:

      如果你要求 sbt fork 运行代码的 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")}"
      

      这对我有用...

      【讨论】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        当你在测试中禁止分叉时,例如:

        fork in test := true
        

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

        【讨论】:

          猜你喜欢
          • 2014-02-23
          • 2014-02-28
          • 2012-05-11
          • 1970-01-01
          • 1970-01-01
          • 2013-04-09
          • 2022-01-15
          • 1970-01-01
          • 2014-09-24
          相关资源
          最近更新 更多