首先注意一个问题:DataSource.groovy在打包后,war包里存在的是DataSource.class文件。我拿着这个文件让部署人员部署,他问我数据库配置在哪啊?我傻眼了,是啊,他咋修改数据库配置啊?不能每次都要我改好了打包发给他吧。怎么解决,google,google......。
阅读grails文档配置文件相关部分,得到如下解决方案:
首先修改conf.groovy:
environments {
development {
runningMode = 'DEV'
grails.logging.jul.usebridge = true
grails.config.locations = ["classpath:datasource_dev.properties"]
}
production {
runningMode = 'PRO'
grails.logging.jul.usebridge = false
grails.config.locations = ["classpath:datasource_pro.properties"]
}
systemTest {
runningMode = 'SYSTEM TEST'
grails.logging.jul.usebridge = false
grails.config.locations = ["classpath:datasource_systest.properties"]
}
}
然后在conf下新建3个文件。
datasource_dev.properties文件内容如下(其余类似):
dataSource.url = jdbc:postgresql://localhost:5432/PhotoManage
dataSource.username=root
dataSource.password=123456
dataSource.dbCreate=update
说明:
(1)grails的配置文件是可以扩展的,定义在datasource_**.properties中的信息会在程序启动时自动读入。
(2)datasource_**.properties内容的书写规则:很简单,安装Config.groovy的结构来就行。例如
Config.groovy中有这样的结构
A{
B{
C{
D.E="haha"
}
}
}
那么到了properties文件中就是A.B.C.D.E=haha。
OK,properties文件在打包时不会变成class文件,部署的哥们可以直接改。就不用麻烦我了。搞定。
过了一段时间,程序出问题了。我跑部署人员那跟他说,你该一下日志级别,打印一下调试级别的信息,我看看那出问题了。他问我在哪改啊?然后我又傻眼了,日志的配置在Config.class中,咋改?
这不和数据库配置一样吗?照样来不就行了。回去我就打算把配置信息也挪到properties文件中。可我看了一下配置信息,好复杂啊,转换成properties也太麻烦了,还容易出错。咋整?google,google....解决方案如下:
首先,修改conf.groovy:
environments {
development {
runningMode = 'DEV'
grails.logging.jul.usebridge = true
grails.config.locations = ["classpath:datasource_dev.properties","file:${basedir}/grails-app/conf/log4jConf.groovy"]
}
production {
runningMode = 'PRO'
grails.logging.jul.usebridge = false
grails.config.locations = ["classpath:datasource_pro.properties","classpath:log4jConf.groovy"]
}
systemTest {
runningMode = 'SYSTEM TEST'
grails.logging.jul.usebridge = false
grails.config.locations = ["classpath:datasource_systest.properties","classpath:log4jConf.groovy"]
}
}
然后在conf下新建文件log4jConf.groovy。log4jConf.groovy中的内容就是conf.groovy中日志配置的内容。
最后,在BuildConfig.groovy中添加:
grails.war.resources = { stagingDir, args ->
copy(todir: "${stagingDir}/WEB-INF/classes"){
fileset(dir:"grails-app/conf",includes:"log4jConf.groovy")
}
}
保证打包时,war文件中包含log4jConf.groovy。
注意:development下,用"file:${basedir}/grails-app/conf/log4jConf.groovy"引入文件。
其实,datasource_**.properties文件也可以以groovy的文件形式引入。groovy比properties优势的地方是可以编写scrpit来实现较复杂的逻辑。
有过了一段时间,项目有新需求,要用到jms。我用的是ActiveMQ:
首先,引入jar包。
然后,在resource.groovy中配置相关bean:
//OMS Queue
accounting(org.apache.activemq.command.ActiveMQQueue,"accounting"){}
omsQueue(org.apache.activemq.command.ActiveMQQueue,"oms-queue"){}
jmsConnectionFactory(org.apache.activemq.ActiveMQConnectionFactory ){
}
cachingConnectionFactory(org.springframework.jms.connection.CachingConnectionFactory){
targetConnectionFactory=ref("jmsConnectionFactory")
sessionCacheSize="1"
}
jmsTemplate(org.springframework.jms.core.JmsTemplate){
connectionFactory=ref("jmsConnectionFactory")
}
omsQueueListenerContainer(org.springframework.jms.listener.DefaultMessageListenerContainer){
connectionFactory=ref("cachingConnectionFactory")
destination=ref("accounting")
messageListener=ref("omsQueueListener")
errorHandler=ref("jmsErrorProcessor")
//exceptionListener=ref("")
pubSubNoLocal=true
sessionTransacted=true
//control the consumption load
concurrentConsumers=1
maxConcurrentConsumers=1
cacheLevelName="CACHE_CONSUMER"
acceptMessagesWhileStopping=false
}
omsQueueListener(com.eternal.finance.business.produce.OmsQueueListener){
waitProduceOrderService=ref("waitProduceOrderService")//处理等待生产订单的service
producedJobService=ref("producedJobService")//处理生产完成的job的service
}
omsQueueProducer( com.eternal.finance.business.produce.OmsQueueProducer){//发送处理结果
jmsTemplate=ref("jmsTemplate")
omsQueue=ref("omsQueue")
}
这里,可以看到jmsConnectionFactory的配置中,需要的url,用户名,密码等属性都没有。因为这些也是要部署人员可以修改的,我这次聪明了,直接这些属性的配置挪了出来,参照datasource_**.properties,新建了jmsconnection_**.properties 3个文件。内容如下:
beans.jmsConnectionFactory.brokerURL=tcp://localhost:61616
beans.jmsConnectionFactory.userName=admin
beans.jmsConnectionFactory.password=admin
当然,还要修改config.groovy,将3个文件就引入:
environments {
development {
runningMode = 'DEV'
grails.logging.jul.usebridge = true
grails.config.locations = ["classpath:datasource_dev.properties","file:${basedir}/grails-app/conf/log4jConf.groovy","classpath:jmsconnection_dev.properties"]
}
production {
runningMode = 'PRO'
grails.logging.jul.usebridge = false
grails.config.locations = ["classpath:datasource_pro.properties","classpath:log4jConf.groovy","classpath:jmsconnection_pro.properties"]
}
systemTest {
runningMode = 'SYSTEM TEST'
grails.logging.jul.usebridge = false
grails.config.locations = ["classpath:datasource_systest.properties","classpath:log4jConf.groovy","classpath:jmsconnection_systest.properties"]
}
}
对resource.groovy进行扩展遵循的规则和扩展config.groovy是一样的,内容的写法也一样。
最后说一点:扩展文件里的配置会覆盖原有的配置(如果原有配置没有去掉的话)。
OK,全部搞定,可以交给部署的兄弟部署了。
这篇文章介绍的是配置文件的扩展和这样扩展的原因以及具体如何做。上边的例子只是我的方式,关键还是掌握扩展的原则,掌握了原则你就能按照自己的需要随心所欲的扩展配置文件了。
关于配置文件的官方文档看这里:http://grails.org/doc/latest/guide/conf.html#configExternalized