2014-08-28 50 views
3

请注意:看来我可能在这里使用*.groovy文件使事情变得复杂,因为它需要在运行时正确编译和接线。 基于*.properties的解决方案,我现在更有趣!Grails从类路径中的文件读取属性?

我想补充一个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,我会看到输出像:

嘶嘶声的价值是嗡嗡声。

相反,我看到:

香味的值是[:]。

这是怎么回事,我需要做些什么来解决这个问题?最终,Custom.groovycustom.properties文件可以位于Grails的应用程序内的任何地方(不conf目录,虽然这将是我的偏好)。唯一重要的是我可以在Config.groovy之外定义变量,并在Grails进入build/run/test/etc时在Config.groovy之内访问它们。应用程序。

+1

你可以尝试给你的文件的完整路径到位置..像 “文件:customConfig.groovy” – 2014-08-28 11:43:40

+0

谢谢@LalitAgarwal(+1) - 我可以试一试,但在我做之前,我只想确保我理解你的问题。你问我是否可以给**绝对文件路径**而不是'classpath' URI?如果是这样,我会倾向于说“* no *”,因为Grails应用程序可能从机器内的任何位置运行('etc/apps/mygrailsapps','/ home/myuser/foo/bar/mygrailsapp'等)。 – DirtyMikeAndTheBoys 2014-08-28 11:47:35

回答

3

grails.config.locations财产可包括Class对象以及URL字符串,所以

grails.config.locations = [Custom] 

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

如果你想.groovy在你的战争结束了(这样你就可以在生产服务器上进行编辑,而不必每次都重建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。如果您想检查您的外部设备是否对配置做出了正确的贡献,那么您必须这样做,在完成配置加载并合并在一起之后,您必须这样做oustideConfig.groovy。最简单的方法可能是在BootStrap中执行一些log.debug语句。

或者可能简单一些,让你产生groovy文件中适当的类,而不是ConfigSlurper脚本,所要求的性能static final领域

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

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

+0

谢谢@Ian Roberts(+1) - 我已经更新了我的问题,以反映我的'grails.config.locations'属性的实际值(在我的原始文章中,我只是简单化了它)。我试过你的建议,把'Config'作为一个位置,我仍然得到相同的结果。有任何想法吗?再次感谢! – DirtyMikeAndTheBoys 2014-08-28 11:52:31

+0

作为一个侧面思考,也许我用.groovy文件过度复杂的东西。一个解决方案看起来像是在'custom.properties'文件中读取的内容?实际上,我只是将简单的键/值对存储在这个文件中。 – DirtyMikeAndTheBoys 2014-08-28 11:53:32

+1

@Zac你需要删除“自定义”轮的引号 - 它需要是一个'java.lang.Class'文字,而不是一个给出类名的字符串。 – 2014-08-28 12:05:02