请注意:似乎我在这里使用*.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.groovy
或custom.properties
文件可以位于任何地方在Grails应用程序内部(不会将作为conf
目录,尽管这是我的偏好)。唯一重要的是我可以在Config.groovy
之外定义变量,并在Grails进入构建/运行/测试/等时在Config.groovy
内访问它们。应用程序。
答案 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
等。