Как загрузить конфигурацию источника данных из внешнего файла в Grails 3.1.8?
Я пишу приложение Grails 3.1.8. Мой источник данных написан в файле application.groovy.
Я хочу загрузить конфигурацию источника данных, такую как имя пользователя, пароль, БД из внешнего файла. Есть ли способ сделать это в Grails 3+ версии.
Вот моя конфигурация источника данных в application.groovy:-
hibernate {
cache {
queries = false
use_second_level_cache = true
use_query_cache = false
region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory'
}
}
dataSource {
pooled = true
jmxExport = true
dialect = 'org.hibernate.dialect.PostgreSQLDialect'
driverClassName = 'org.postgresql.Driver'
username = 'postgres'
password = 'postgres'
properties = {
jmxEnabled = true
initialSize = 5
maxActive = 50
minIdle = 5
maxIdle = 25
maxWait = 10000
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
validationQuery = "SELECT 1"
validationQueryTimeout = 3
validationInterval = 15000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
ignoreExceptionOnPreLoad = true
jdbcInterceptors = "ConnectionState;StatementCache(max=200)"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED // safe default
abandonWhenPercentageFull = 100 // settings are active only when pool is full
removeAbandonedTimeout = 120
removeAbandoned = true
logAbandoned = false // causes stacktrace recording overhead, use only for debugging
}
}
environments {
development {
dataSource {
dbCreate = 'update'
url = "jdbc:postgresql://localhost:5432/testdb"
logSql = true
}
}
test {
dataSource {
dbCreate = 'update'
url = "jdbc:postgresql://localhost:5432/testdb"
logSql = true
}
}
production {
dataSource {
dbCreate = 'update'
url = "jdbc:postgresql://localhost:5432/testdb"
logSql = true
}
}
}
4 ответа
Вот решение, которое сработало для меня, вы можете попробовать.
Это решение будет работать для Grails 3.0+
Прежде всего необходимо добавить следующую зависимость:
скомпилируйте 'org.grails.plugins:external-config:1.1.2'
Затем необходимо создать внешний файл конфигурации groovy, например:
дб-Config.groovy
затем нужно поместить этот файл конфигурации за пределы каталога приложения или библиотеки Tomcat. например:
D: \ Apache-8.0.47-кот \ Lib
Затем нужно прочитать конфигурационный файл из application.groovy. В application.groovy необходимо разместить следующую строку кода для каждой среды:
grails.config.locations = ['file: /// ${catalina.home} /lib/db-config.groovy']
или же
grails.config.locations = ['file:///D:/apache-tomcat-8.0.47/lib/db-config.groovy']
Вы можете использовать ${catalina.home}, если в вашей системе установлена переменная окружения CATALINA_HOME. Кроме того, вы должны использовать прямой путь, который я показал.
Так что ваше application.groovy будет следующим:
> environments {
> development {
> grails.config.locations = ['file:///${catalina.home}/lib/db-config.groovy']
> }
> production {
> grails.config.locations = ['file:///${catalina.home}/lib/db-config.groovy']
> ]
> }
> }
и ваш файл db-config.groovy будет содержать следующие строки:
> dataSource {
> username = <DB_USER_NAME>
> password = <DB_PASSWORD>
> dbCreate = 'update'
> url = <DB_URL>
> logSql = true
> }
Вы можете использовать разные файлы db-config.groovy для каждой среды.
Вы можете загрузить свой внешний файл конфигурации из файловой системы, используя следующую реализацию.
Этот пример определяет для каждой среды (разработка / производство / тестирование) отдельный путь к внешнему файлу конфигурации.
environments {
development {
grails.config.locations = [
"file:///home/<CONFIG_FILE_LOCATION_DIR>/myconfig_developement.groovy" //for Unix based systems
]
}
production {
grails.config.locations = [
"file:///home/<CONFIG_FILE_LOCATION_DIR>/myconfig_production.groovy" // for Unix based systems
]
}
}
Поместите конфигурацию вашей базы данных в myconfig_developement.groovy
следующее:
dataSource {
dbCreate = 'update'
url = "jdbc:postgresql://localhost:5432/testdb"
logSql = true
}
Вы можете использовать это решение (это работало для меня, с Grails 3.1.x)
Grails-приложение / INIT /Application.groovy:
class Application extends GrailsAutoConfiguration implements EnvironmentAware {
static void main(String[] args) {
GrailsApp.run(Application, args)
}
@Override
void setEnvironment(Environment environment) {
def path = "/etc/grails-app-config.properties"
def file = new File(path)
if(file.exists()) {
def config = new ConfigSlurper().parse(file.text)
environment.propertySources.addFirst(new MapPropertySource(grails.util.Environment.getCurrent().name, config))
}
}
}
Вы можете использовать переменную окружения для пути конфигурации:
System.getenv(ENV_CONF_FILE_VAR)
grails-app-config.properties:
dataSource.dbCreate='update'
dataSource.driverClassName='com.mysql.jdbc.Driver'
dataSource.url='jdbc:mysql://localhost:5432/testdb'
dataSource.username='user'
dataSource.password='pass'
com.test='test'
com.numTest=4
Вы можете использовать плагин Grails external-config и определить конфигурацию в вашем внешнем файле конфигурации.
grails.config.locations = [
"file:///etc/app/myconfig.groovy"
]
А затем определить конфигурацию источника данных в myconfig.groovy
Я использую grails 3.3.11, и вот что я сделал для загрузки моей конфигурации БД из внешнего файла / источника:
application.yaml:
оставил все значения пустыми, чтобы их можно было переопределить внешним источником
dataSource:
pooled: true
driverClassName: "com.microsoft.sqlserver.jdbc.SQLServerDriver"
url:
username:
password:
loggingSql: true
Теперь есть два способа запустить приложение:
- bootRun (конфигурация ниже)
- Запускаемая jar или война, java -jar --spring.config.location=file:external.properties
bootRun (build.gradle)
def Properties localBootRunProperties() {
Properties p = new Properties()
p.load(new FileInputStream("path to external.properties"))
return p
}
bootRun {
doFirst {
bootRun.systemProperties = localBootRunProperties()
}
...
}
Теперь файл external.properties должен иметь точно такую же конфигурацию для переопределения значений application.yaml.
dataSource.url=
dataSource.username=
dataSource.password=
Вот и все. Наслаждаться.