我正在尝试使用Grails的内置机制在部署的WAR文件之外加载外部配置文件(* .groovy和* .properties)。文档意味着只需将grails.config.locations
设置为适当的classpath:
或file:
路径。
我已将Config.groovy配置为:
String externalConfigLocation = System.getProperty("SYSTEM_PROPERTY_KEY")
if (!grails.config.locations || !(grails.config.locations instanceof List)) {
grails.config.locations = []
}
if (classpathExternalConfigLocation) {
String pathToResource = "\"file:${basedir}" + File.separator + externalConfigLocation+"\""
print "Loading external configuration file: ${pathToResource}\n"
grails.config.locations << pathToResource
}
然而,这不起作用,错误消息指示文件“不存在”。但是,打印grails.config.locations
中存储的绝对路径表示确实如此。我尝试了一些组合:
classpath:configurationFile.properties
file:c:\path_to_file\configurationFile.properties
c:\path_to_file\configurationFile.properties
但在所有这些情况下都无法找到该文件。
非常奇怪 - 建议表示赞赏。或者有关如何调试的建议。
答案 0 :(得分:13)
这就是我通常做的事情:
grails.config.locations = ["classpath:${appName}-config.groovy",
"file:./${appName}-config.groovy"]
if (System.properties["${appName}.config.location"]) {
grails.config.locations << "file:" + System.properties["${appName}.config.location"]
}
这允许我在项目根目录中放置一个文件,以便在部署为战争时在开发时使用文件:位置和服务器类路径中的文件来本地自定义属性。 Tomcat的lib文件夹位于其类路径中,因此如果您使用Tomcat,这是放置文件的好地方。通过将应用程序名称放在文件中,您可以拥有多个配置文件,而不会相互踩踏。
请务必将本地配置文件添加到svn:ignore或.gitignore,这样就不会将其检入源代码管理中。然后,每个开发人员都可以拥有自己的设置(或只使用默认设置),而不会影响其他人。
这是外部化数据库密码和其他生产值的好方法。应用程序部署者(理想情况下不是开发人员)管理文件及其内容,这样可以避免将密码签入源代码管理中。比使用JNDI IMO要好得多。
答案 1 :(得分:2)
我不认为你在战争中得到了base.dir