grails配置文件扩展

2023-10-16 05:38
文章标签 扩展 配置文件 grails

本文主要是介绍grails配置文件扩展,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先注意一个问题: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

这篇关于grails配置文件扩展的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/219397

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[

PHP7扩展开发之字符串处理

前言 这次,我们来看看字符串在PHP扩展里面如何处理。 示例代码如下: <?phpfunction str_concat($prefix, $string) {$len = strlen($prefix);$substr = substr($string, 0, $len);if ($substr != $prefix) {return $prefix." ".$string;} else

PHP7扩展开发之类型处理

前言 这次,我们将演示如何在PHP扩展中如何对类型进行一些操作。如,判断变量类型。要实现的PHP代码如下: <?phpfunction get_size ($value) {if (is_string($value)) {return "string size is ". strlen($value);} else if (is_array($value)) {return "array si

PHP7扩展开发之依赖其他扩展

前言 有的时候,我们的扩展要依赖其他扩展。比如,我们PHP的mysqli扩展就依赖mysqlnd扩展。这中情况下,我们怎么使用其他扩展呢?这个就是本文讲述的内容。 我们新建立一个扩展,名字叫 demo_dep , 依赖之前的say扩展。 在demo_dep扩展中,我们实现demo_say方法。这个方法调用say扩展的say方法。 代码 基础代码 确保say扩展的头文件正确安装到了php

PHP7扩展开发之函数方式使用lib库

前言 首先说下什么是lib库。lib库就是一个提供特定功能的一个文件。可以把它看成是PHP的一个文件,这个文件提供一些函数方法。只是这个lib库是用c或者c++写的。 使用lib库的场景。一些软件已经提供了lib库,我们就没必要再重复实现一次。如,原先的mysql扩展,就是使用mysql官方的lib库进行的封装。 在本文,我们将建立一个简单的lib库,并在扩展中进行封装调用。 代码 基础

PHP7扩展开发之对象方式使用lib库

前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa