Grails从类路径中的文件中读取属性?

时间:2014-08-28 11:41:08

标签: grails groovy configuration classpath

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

我想在我的Grails(2.3.6)应用的Custom.groovy目录中添加custom.properties(或最差情况,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的价值是嗡嗡声。

相反,我看到了:

  

fizz的价值是[:]。

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

1 个答案:

答案 0 :(得分:4)

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

grails.config.locations = [Custom]

可以满足您的需求 - .groovy下的grails-app/*文件在构建应用程序时被编译,生成的.class文件进入WAR(在WEB-INF/classes下)但是不是.groovy文件本身。

如果您希望.groovy 在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。最简单的方法可能是在log.debug中执行一些BootStrap语句。

或者可能更简单,将生成的Groovy文件设置为正确的类而不是ConfigSlurper脚本,并将所需属性设置为static final个字段

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

然后在Config.groovy中,您可以参考LazyBonesConfig.VERSION等。