如何使用系统属性替换 Typesafe Config 文件中的占位符?

Posted

技术标签:

【中文标题】如何使用系统属性替换 Typesafe Config 文件中的占位符?【英文标题】:How to use system properties to substitute placeholders in Typesafe Config file? 【发布时间】:2013-09-02 10:26:46 【问题描述】:

我需要在我的 application.conf 文件中引用 java.io.tmpdir

我用

打印了我的配置内容
val c = ConfigFactory.load()
System.err.println(c.root().render())

它会像这样渲染它

# dev/application.conf: 1
"myapp" : 
    # dev/application.conf: 47
    "db" : 
        # dev/application.conf: 49
        "driver" : "org.h2.Driver",
        # dev/application.conf: 48
        "url" : "jdbc:h2:file:$java.io.tmpdir/db;DB_CLOSE_DELAY=-1"
    
 ...
 
# system properties
"java" : 
    # system properties
    "io" : 
        # system properties
        "tmpdir" : "/tmp"
    ,
....

所以我猜前向引用不起作用。有没有办法在系统属性之后加载我的选项,以便配置解析器正确替换值?

【问题讨论】:

请注意ConfigFactory.parseFile 不使用系统属性,而ConfigFactory.load 使用。 【参考方案1】:

前向引用工作正常;我相信问题只是你在引号内有$ 语法,所以它没有特殊含义。试试这样:

url = "jdbc:h2:file:"$java.io.tmpdir"/db;DB_CLOSE_DELAY=-1"

(注意$ 的东西没有被引用)

在 HOCON 格式中,任何有效的 JSON 都将被解释为它在 JSON 中的样子,因此引用的字符串内部没有特殊语法,除了 JSON 支持的转义序列。

【讨论】:

以上是关于如何使用系统属性替换 Typesafe Config 文件中的占位符?的主要内容,如果未能解决你的问题,请参考以下文章

Play TypeSafe Activator 无法启动 - IllegalArgumentException“无法下载新模板目录属性”

如何使用 Enum 类型的字段执行 Typesafe JSON?

typesafe 使用 reactjs 和 typescript 选择 onChange 事件

如何在 Typesafe Config 中获取未包装的密钥?

如何强制 Typesafe Activator 监听 0.0.0.0:8888

Typesafe Activator 里面的 sbt 在哪里?