2016-01-21 14 views
2

Я делаю приложение с версией Grails 2.5.3. Я хочу передать внешний код базы данных и раздел Log4j.Grails - grails.config.locations не работают с файлом classpath и .properties

Код Log4j находится во внешнем файле .groovy. Этот файл не будет изменен пользователем, поэтому нет необходимости быть файлом свойств в каталоге/classes. Лучшим в случае кода базы данных является наличие нескольких функций во внешнем файле свойств, поскольку он будет оставаться файлом свойств в каталоге/classes. Кроме того, DataSource.groovy существует с остальной частью конфигурации.

Тогда я только достиг работать Log4j конф с:

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

С классами не работаю, хотя я положил файл в/Grails-приложении/конф реже. Это не работает:

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

Кроме того, я добавил оба случая (run-app и war mode). Однако, когда я запускаю grails prod war и развертываю Tomcat, Logconfig.groovy не распознается.

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

И в случае кода базы данных я не смог выполнить файл .properties. Этот файл я положил в Grails-приложение/конф и его содержат в:

# 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 

Я прочитал много учебник и блоги, и я не знаю, как я могу это сделать, чтобы работать.

Спасибо за помощь.

+0

Добавить новую конфигурацию для .groovy файлов. Проблема с файлом войны развертывания. –

ответ

4

Как мы это делаем в режиме разработки и производства.

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

Config.groovy в каталоге Grails-приложения:

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 , Когда у вас есть каталог конфигурационного файла в classpath, все работает нормально.

Например, мы запускаем Tomcat и имеем сценарии запуска, которые экспортируют конфигурацию -каталог в путь к классам.

Для Grails 3.x Я написал поддержку для этого grails.config.потому что они удалили эту функцию, и я не хочу изменять, как мы это делаем. Поэтому поставьте ваши grails.config.locations -configurations в application.groovy в файле 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)) 
        } 
       } 
      } 
     } 
    } 
} 

И в вашем Grails-приложение/INIT -folder у вас есть 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) 
    } 

} 
+0

Спасибо. Я должен решить это, но забыл прокомментировать решение здесь. Я не знал разницы между файловым и classpath, и по этой причине я не понял эту операцию. Однако файл свойств не работает, он работает только в файле groovy. –

+0

Файлы '.properties' и' .groovy' работают для меня. Спасибо Сами за чудесное обходное решение! – ilPittiz

+0

@Sami http://stackoverflow.com/questions/42839975/classpath-property-file-in-grails-app-is-not-being-used У меня есть точная ситуация как оригинальный плакат, но ваше решение не кажется, работает, возможно? Был бы признателен, если бы вы посмотрели. – jbu

0

В нашей команде мы обычно кладет в конфе/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 с путем к устр конфигурация Fe:

экспорт PROJECT_NAME_CONFIG =/главная/пользователя/Документы/работа/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" 
     } 
    } 
} 
+0

Спасибо, что ответили мне. Да, это возможное решение. Но я не ищу, чтобы поместить файлы во внешний путь проекта. Я хочу включить в проект. И в этом случае: «classpath:» не работает ни в коем случае (.groovy и .properties) и с «file:» работает только с .groovy файлами. –

+0

Итак, почему бы вам не поместить мою конфигурацию базы данных My_Project_Config.groovy в папку ./conf и добавить в Config.groovy: grails.config.locations = ["файл: ./ grails-app/conf/My_Project_Config.groovy «]? –

+0

Оформить заказ также: http://stackoverflow.com/a/3807770/2166188 –