【问题标题】:Grails - grails.config.locations don't work with classpath and .properties fileGrails - grails.config.locations 不适用于类路径和 .properties 文件
【发布时间】:2016-02-10 01:00:27
【问题描述】:

我正在使用 Grails 2.5.3 版本进行应用程序。我想把数据库代码和Log4j部分外包出去。

Log4j 的代码在一个外部的 .groovy 文件中。用户不会修改此文件,因此不必是 /classes 目录中的属性文件。 在数据库代码的情况下,最好的方法是在外部属性文件中包含几个功能,因为将继续作为 /classes 目录中的属性文件。此外,DataSource.groovy 与其余配置一起存在。

然后,我只实现了使用 Log4j conf 工作:

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

虽然我将文件放在 /grails-app/conf 目录中,但类路径不起作用。这不起作用:

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

另外,我添加了两种情况(运行应用程序和战争模式)。但是,当我运行 grails prod war 并部署 Tomcat 时,无法识别 Logconfig.groovy。

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

对于数据库代码,我无法使用 .properties 文件。 这个文件我放在 grails-app/conf 中,它的包含是:

# 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

我已经阅读了很多教程和博客,但我不知道如何才能做到这一点。

感谢您的帮助。

【问题讨论】:

  • 为 .groovy 文件添加新配置。部署战争文件有问题。

标签: grails log4j datasource grails-plugin grails-3.0


【解决方案1】:

我们如何在开发和生产模式下做到这一点。

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

grails-app 目录下的 Config.groovy:

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",
        ]
    }
}

对于应用程序服务器(Tomcat、Websphere 等)中的部署,您只需将配置文件所在的目录添加到类路径。当您在类路径中有配置文件目录时,一切正常。

例如,我们运行 Tomcat 并具有将配置目录导出到类路径的启动脚本。

对于 Grails 3.x,我写了对这个 grails.config.locations 的支持,因为他们删除了这个特性,我不想改变我们做配置的方式。所以把你的 grails.config.locations -configurations 放到 grails-app/conf -directory 中的 application.groovy 中。

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))
                    }
                }
            }
        }
    }
}

在你的 grails-app/init 文件夹中你有你的 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)
    }

}

【讨论】:

  • 谢谢。我必须解决它,但忘记在这里评论解决方案。我不知道文件和类路径之间的区别,因此我不了解操作。但是,属性文件不起作用,它只适用于 groovy 文件。
  • .properties.groovy 文件都对我有用。感谢 Sami 提供的出色解决方法!
  • @Sami stackoverflow.com/questions/42839975/… 我的情况与原始发帖人的情况完全相同,但您的解决方案似乎不起作用,可能吗?如果您看一看,将不胜感激。
【解决方案2】:

在我们的团队中,我们通常会放入 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)
}

并指定具有特定名称 PROJECT_NAME_CONFIG 的环境变量,以及 dev config f.e. 的路径:

导出 PROJECT_NAME_CONFIG=/home/user/Documents/work/my_project/My_Project_Config.groovy

导出 PATH="$PATH:$PROJECT_NAME_CONFIG"

示例 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"
        }
    }
}

【讨论】:

  • 感谢您回复我。是的,这是一个可能的解决方案。但我不搜索将文件放在项目的外部路径中。我想把项目放在里面。在这种情况下:“classpath:”在任何情况下都不起作用(.groovy 和 .properties),而“file:”仅适用于 .groovy 文件。
  • 好的,那你为什么不把我的示例数据库配置 My_Project_Config.groovy 放在 ./conf 文件夹中并添加到 Config.groovy:grails.config.locations = ["file:./grails- app/conf/My_Project_Config.groovy"]?
  • 我无法将 .groovy 文件放入我的项目中,因为它总是会被编译为“.class”文件。那么,在 Log4j 的情况下是可能的,但在 DataBase 代码的情况下是不可能的,因为用户不能轻易地修改配置。
猜你喜欢
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多