简体   繁体   中英

Grails - grails.config.locations don't work with classpath and .properties file

I am doing an application with Grails 2.5.3 version. I want to outsource the database code and the section of Log4j.

The code of Log4j is in a external .groovy file. This file won't be modified by user so it is not necessary to be a properties file in /classes dir. The best in the case of database code is to have several features in a external properties file because will continue being a properties file in /classes dir. Also, DataSource.groovy exists with the rest of the configuration.

Then, I have only achieved to work Log4j conf with:

grails.config.locations = ["file:./grails-app/conf/LogConfig.groovy"]

With classpath doesn't work though I put the file in /grails-app/conf dir. This doesn't work:

grails.config.locations = ["classpath:LogConfig.groovy"]

Also, I have added both cases (run-app and war mode). However, when I run grails prod war and deploy Tomcat, Logconfig.groovy is not recognize.

grails.config.locations = ["file:./grails-app/conf/LogConfig.groovy",
"classpath:LogConfig.groovy"]

And in the case of database code, I didn't achieve to work the .properties file. This file I put in grails-app/conf and its contain is:

# DB properties
dataSource.username = xxx
dataSource.password = xxx
dataSouce.driverClassName = xxx
environments.development.dataSource.url = jdbc:mysql://localhost/xxx
environments.test.dataSource.url = jdbc:mysql://localhost/xxx
environments.production.dataSource.url = jdbc:mysql://localhost/xxx

I have read many tutorial and blogs and I don't know how I can do it to work.

Thanks for the help.

How we do it in the development and production mode.

your-application/
    conf/
        dev/
        qa/
        prod/
    grails-app/
        conf/
          Config.groovy

Config.groovy in the grails-app directory:

environments {

    development {
        grails.logging.jul.usebridge = true

        grails.config.locations = [
          "file:conf/dev/XXXConfig.groovy",
          "file:conf/dev/XXXDataSource.groovy",
          "file:conf/dev/XXXLog4JConfig.groovy",
          "file:conf/dev/plugins/XXXSecurityConfig.groovy",
        ]        
    }
    production {
        grails.logging.jul.usebridge = false

        grails.config.locations = [
          "classpath:XXXConfig.groovy",
          "classpath:XXXDataSource.groovy",
          "classpath:XXXLog4JConfig.groovy",
          "classpath:plugins/XXXSecurityConfig.groovy",
        ]
    }
}

For deployments in the application server (Tomcat, Websphere etc) you have to just ADD THE DIRECTORY WHERE CONFIGURATION FILES ARE TO THE CLASSPATH. When you have your configuration file directory in the classpath everything works fine.

For example we run Tomcat and have startup scripts that do export configuration -directory to the classpath.

For Grails 3.x I wrote support for this grails.config.locations because they removed the feature and I don't want to change how we do the configs. So put your grails.config.locations -configurations to the application.groovy in the grails-app/conf -directory.

import org.grails.core.io.DefaultResourceLocator
import org.springframework.core.env.Environment
import grails.boot.config.GrailsAutoConfiguration
import org.springframework.core.env.MapPropertySource

class ApplicationConfigurationLoader {

    private ApplicationConfigurationLoader() {}

    public static load(GrailsAutoConfiguration application, Environment environment) {
        if (application && environment) {
            DefaultResourceLocator resourceLocator = new DefaultResourceLocator()
            def applicationGroovy = application.getClass().classLoader.getResource('application.groovy')
            if (applicationGroovy) {
                def applicationConfiguration = new ConfigSlurper(grails.util.Environment.current.name).parse(applicationGroovy)
                for (String configLocation in applicationConfiguration.grails.config.locations) {
                    def configurationResource = resourceLocator.findResourceForURI(configLocation)
                    if (configurationResource) {
                        def config = new ConfigSlurper(grails.util.Environment.current.name).parse(configurationResource.getURL())
                        environment.propertySources.addFirst(new MapPropertySource(configLocation, config))
                    }
                }
            }
        }
    }
}

And in your grails-app/init -folder you have your Application.groovy

import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration

import org.springframework.core.env.Environment
import org.springframework.context.EnvironmentAware

import com.bcbmedical.bfw.core.util.ApplicationConfigurationLoader

class Application extends GrailsAutoConfiguration implements EnvironmentAware {
    static void main(String[] args) {
        GrailsApp.run(Application, args)
    }

    @Override
    void setEnvironment(Environment environment) {
        ApplicationConfigurationLoader.load(this, environment)
    }

}

In our team we usually put in conf/Config.groovy:

def ENV_NAME = "PROJECT_NAME_CONFIG"

grails.config.locations = [EventHandlers]

if (System.getenv(ENV_NAME)) {
    println "Loading configuration file founded in environment variable - " + System.getenv(ENV_NAME)
    grails.config.locations << "file:" + System.getenv(ENV_NAME)
}
else if (System.getProperty(ENV_NAME)) {
    println "Loading configuration from property: " + System.getProperty(ENV_NAME)
    grails.config.locations << "file:" + System.getProperty(ENV_NAME)
}

and specify environment variable with specific name PROJECT_NAME_CONFIG, with path to dev config fe:

export PROJECT_NAME_CONFIG=/home/user/Documents/work/my_project/My_Project_Config.groovy

export PATH="$PATH:$PROJECT_NAME_CONFIG"

example My_Project_Config.groovy:

environments {
    development {

        dataSource {
            username = "root"
            password = "password"

            logSql = true
            dbCreate = "update"
            url = "jdbc:mysql://localhost/my_project?useUnicode=yes&characterEncoding=UTF-8&autoReconnect=true"
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM