【问题标题】:Grails reading properties in from files on the classpath?Grails从类路径上的文件中读取属性?
【发布时间】:2014-08-28 11:41:08
【问题描述】:

请注意:似乎我在这里使用*.groovy 文件可能会使事情复杂化,因为它需要在运行时正确编译和连接。 我现在对基于 *.properties 的解决方案更感兴趣!

我想将Custom.groovy(或最坏情况下,custom.properties)文件添加到我的 Grails (2.3.6) 应用程序的 conf 目录,然后配置 Config.groovy 以读取该文件和任何属性存放在里面。

所以:

mygrailsapp/
    grails-app/
        conf/
            BuildConfig.groovy
            Config.groovy
            <other stuff>
            Custom.groovy or custom.properties

Custom.groovy/custom.properties 可能看起来像:

fizz = "buzz"

然后,在Config.groovy

grails.config.locations = [
    "classpath:${appName}-config.properties",
    "classpath:${appName}-config.groovy",
    "file:${userHome}/.grails/${appName}-config.properties",
    "file:${userHome}/.grails/${appName}-config.groovy",
    Custom
]

println "The value of fizz is ${fizz}."

如果它工作正常,那么当我运行grails run-app 时,我会看到如下输出:

嘶嘶声的价值是嗡嗡声。

相反,我看到了:

fizz 的值为 [:]。

这里发生了什么,我需要做些什么来解决这个问题?最终,Custom.groovycustom.properties 文件可以位于 任何地方 Grails 应用程序(必须 成为conf 目录,尽管这是我的偏好)。唯一重要的是我可以在Config.groovy 之外定义变量,并在Grails 进行构建/运行/测试/等时在Config.groovy 中访问它们。应用程序。

【问题讨论】:

  • 你能不能试着把你的文件的完整路径放到位置中……比如“file:customConfig.groovy”
  • 谢谢@LalitAgarwal (+1) - 我可以试一试,但在此之前,我只是想确保我理解你的问题。您是在问我是否可以提供 绝对文件路径 而不是 classpath URI?如果是这样,我倾向于说“no”,因为 Grails 应用程序可能在机器内的任何地方运行(etc/apps/mygrailsapps/home/myuser/foo/bar/mygrailsapp 等。 )。

标签: grails groovy configuration classpath


【解决方案1】:

grails.config.locations 属性可以包含 Class 对象以及 URL 字符串,所以

grails.config.locations = [Custom]

会做你需要的 - 在构建应用程序时编译 grails-app/* 下的 .groovy 文件,生成的 .class 文件进入 WAR(在 WEB-INF/classes 下)而不是 .groovy 文件本身。

如果您希望 .groovy source 最终出现在您的 WAR 中(这样您就可以在生产服务器上编辑它,而不必每次都重新构建 WAR),那么您需要将它放入grails-app 以外的某个地方。您可以尝试将(.groovy.properties)文件直接放入web-app/WEB-INF/classes,然后应该允许

grails.config.locations=["classpath:Custom.groovy", "classpath:custom.properties"]

正常工作。


编辑:我现在看到了问题 - 您不能从主 Config.groovy 内部引用外部配置文件中定义的值,因为该过程是 Grails 首先加载和处理 Config.groovy,然后提取 grails.config.locations然后依次加载每个指定的外部文件,然后它会将来自不同文件的值合并在一起以生成最终的grailsApplication.config。如果您想检查您的外部是否对配置做出了正确的贡献,那么您必须在完整的配置加载并合并在一起之后,oustide Config.groovy。最简单的方法可能是在BootStrap 中做一些log.debug 语句。

或者可能更简单,使您生成的 Groovy 文件成为适当的类而不是 ConfigSlurper 脚本,所需属性为 static final 字段

class LazyBonesConfig {
  static final VERSION = "1.0"
  static final APPNAME = "example"
}

然后在Config.groovy你可以参考LazyBonesConfig.VERSION

【讨论】:

  • 感谢@Ian Roberts (+1) - 我更新了我的问题以反映我的grails.config.locations 属性的实际价值(在我的原始帖子中,我过于简化了它)。我已经尝试过您的建议,将Config 添加为位置,但我仍然得到相同的结果。有任何想法吗?再次感谢!
  • 作为一个侧面的想法,也许我使用 .groovy 文件使事情变得过于复杂。刚刚在custom.properties 文件中读取的解决方案是什么样的?实际上,我只是在这个文件中存储简单的键/值对。
  • @Zac 您需要删除“自定义”周围的引号 - 它需要是 java.lang.Class 文字,而不是给出类名的字符串。
  • @Zac 我想你可以在Config.groovy 中明确地自己做Properties.load。但也许如果您可以解释更高级别的用例(可能在单独的问题中),我们可以建议一种替代方法,这意味着它没有必要。
  • @Zac 这在运行时是否必须是动态的,或者 LazyBones 是否可以不只是生成 Config.groovy 并在正确的位置替换属性值?
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 2018-10-12
  • 2013-08-30
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多