Grails - grails.config.locations 不适用于类路径和 .properties 文件
Grails - grails.config.locations don't work with classpath and .properties file
我正在用 Grails 2.5.3 版本做一个应用程序。我想外包数据库代码和Log4j的部分。
Log4j 的代码在外部 .groovy 文件中。该文件不会被用户修改,因此不必是 /类 目录中的属性文件。
对于数据库代码,最好的办法是在外部属性文件中包含多个功能,因为它将继续作为 /类 目录中的属性文件。此外,DataSource.groovy 与其余配置一起存在。
然后,我只实现了使用 Log4j conf 工作:
grails.config.locations = ["file:./grails-app/conf/LogConfig.groovy"]
尽管我将文件放在 /grails-app/conf 目录中,但类路径不起作用。这不起作用:
grails.config.locations = ["classpath:LogConfig.groovy"]
此外,我添加了两种情况(运行-app 和 war 模式)。但是,当我 运行 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
我看了很多教程和博客,但我不知道如何才能让它发挥作用。
感谢您的帮助。
在我们的团队中,我们通常输入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 的环境变量,以及开发配置的路径 f.e.:
export PROJECT_NAME_CONFIG=/home/user/Documents/work/my_project/My_Project_Config.groovy
export 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"
}
}
}
开发生产模式我们是怎么做的
your-application/
conf/
dev/
qa/
prod/
grails-app/
conf/
Config.groovy
Config.groovy 在 grails-app 目录中:
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 等)中的部署,您只需将配置文件所在的目录添加到 CLASSPATH。当您在类路径中有配置文件目录时,一切正常。
例如我们 运行 Tomcat 并且有启动脚本将配置目录导出到类路径。
对于 Grails 3.x 我写了对此的支持 grails.config.locations 因为他们删除了该功能并且我不想更改我们进行配置的方式。因此,将您的 grails.config.locations -配置放入 grails-app/conf -目录中的 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)
}
}
我正在用 Grails 2.5.3 版本做一个应用程序。我想外包数据库代码和Log4j的部分。
Log4j 的代码在外部 .groovy 文件中。该文件不会被用户修改,因此不必是 /类 目录中的属性文件。 对于数据库代码,最好的办法是在外部属性文件中包含多个功能,因为它将继续作为 /类 目录中的属性文件。此外,DataSource.groovy 与其余配置一起存在。
然后,我只实现了使用 Log4j conf 工作:
grails.config.locations = ["file:./grails-app/conf/LogConfig.groovy"]
尽管我将文件放在 /grails-app/conf 目录中,但类路径不起作用。这不起作用:
grails.config.locations = ["classpath:LogConfig.groovy"]
此外,我添加了两种情况(运行-app 和 war 模式)。但是,当我 运行 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
我看了很多教程和博客,但我不知道如何才能让它发挥作用。
感谢您的帮助。
在我们的团队中,我们通常输入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 的环境变量,以及开发配置的路径 f.e.:
export PROJECT_NAME_CONFIG=/home/user/Documents/work/my_project/My_Project_Config.groovy
export 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"
}
}
}
开发生产模式我们是怎么做的
your-application/
conf/
dev/
qa/
prod/
grails-app/
conf/
Config.groovy
Config.groovy 在 grails-app 目录中:
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 等)中的部署,您只需将配置文件所在的目录添加到 CLASSPATH。当您在类路径中有配置文件目录时,一切正常。
例如我们 运行 Tomcat 并且有启动脚本将配置目录导出到类路径。
对于 Grails 3.x 我写了对此的支持 grails.config.locations 因为他们删除了该功能并且我不想更改我们进行配置的方式。因此,将您的 grails.config.locations -配置放入 grails-app/conf -目录中的 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)
}
}