假设我有一个名为myCoolApp
的Grails应用程序。
此外,假设我在grails-app/conf/Config.groovy
和grails-app/conf/DataSource.groovy
配置文件下的test
和production
中定义了一些基本属性。Config.groovy
设置为与以下.groovy
外部配置文件合并(如果在所有上都找到):
grails.config.locations = ["file:${userHome}/.grails/${appName}-config.groovy"]
最后,我还在本地* NIX用户路径下的外部测试服务器内部定义了这样的文件:
/home/appServerTestUser/.grails/myCoolApp-config.groovy
可悲的是,我发现由于某种原因,当Tomcat实例启动时,外部
.groovy
文件的属性没有被合并。/home/appServerTestUser/.grails/myCoolApp-config.groovy
上找到了您的外部配置文件”,这些是我合并到Config.groovy
中的属性? 谢谢!
最佳答案
在已部署的应用程序中,基于文件的路径没有多大意义。在您的开发机器上部署进行测试时,它可以工作,但在其他任何机器上可能会失败。即使使用正确的路径配置,它也可能会在本地失败,因为该进程将像以其他低特权用户身份运行。
您可以使用绝对路径,例如/etc/myapp/path/to/file
,但这倾向于将部署与文件系统结构耦合在一起,因此,如果您在Windows中进行开发并在Linux上进行部署,则使它们都正常工作将非常棘手。
因此,部署Tomcat的最佳选择是使用classpath语法。您可以指定多个文件,它将加载所有找到的文件,因此我通常为本地开发人员提供一个条目,为已部署的应用程序提供一个条目:
grails.config.locations = [
"classpath:${appName}-config.groovy",
"file:./${appName}-config.groovy"
]
我删除.properties文件的条目是因为Groovy语法更加灵活,但是如果您愿意,可以使用它们。我还将dev文件保留在项目根目录中(并从源代码管理中排除)。
因此,在部署时,请正确命名文件(不同的应用程序将具有不同的文件,因此不会发生冲突)并将它们放置在Tomcat的lib目录中。这在类路径中,因此
classpath:
条目将看到它。