2016-01-21 75 views
2

我正在使用Grails 2.5.3版本進行應用程序。我想外包數據庫代碼和Log4j的部分。Grails - grails.config.locations不適用於classpath和.properties文件

Log4j的代碼位於外部.groovy文件中。這個文件不會被用戶修改,所以沒必要成爲/ classes目錄下的一個屬性文件。 在數據庫代碼的情況下,最好的辦法是在外部屬性文件中包含多個功能,因爲它們將繼續作爲/ classes目錄中的屬性文件。此外,DataSource.groovy與其他配置一起存在。

然後,我只取得了工作的Log4j的conf有:

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

隨着classpath中,雖然我將文件放在/的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 

我看了很多教程和博客,我不知道我該怎麼做它的工作。

感謝您的幫助。

+0

添加新的配置.groovy文件。部署war文件存在問題。 –

回答

4

我們如何做到這一點的研發和生產模式。

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的支持。因爲他們刪除了這個功能,我不想改變我們的配置。所以把你的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 /初始化-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

謝謝。我必須解決它,但忘了在這裏評論解決方案。我不知道文件和類路徑之間的區別,因此我不瞭解該操作。但是,屬性文件不起作用,它只適用於groovy文件。 –

+0

'.properties'和'.groovy'文件都適用於我。 感謝薩米人的美妙解決方法! – ilPittiz

+0

@Sami http://stackoverflow.com/questions/42839975/classpath-property-file-in-grails-app-is-not-being-used我有確切的情況作爲原始的海報,但你的解決方案不似乎工作,可能?如果你看一看,會很感激。 – jbu

0

在我們的團隊,我們通常把在的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配置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 = [「file:./ grails-app/conf/My_Project_Config.groovy 「]? –

+0

簽出也是這樣的:http://stackoverflow.com/a/3807770/2166188 –

相關問題