首先,Grails是一个信奉“规约重于配置”的框架,这一点是来自现在流行的Rails.使用Grails的默认设置进行开发,你不需要任何的配置。Grilas装备有一个内置的容器和一个HSQLDB物理内存数据库。
不过有时,你也需要在实际的项目中使用相应的数据库,下面介绍Grails的一些配置(很简单的,这里我用自己的一些项目来说明):
对于普通的配置 Grails 提供了一个路径为 grails-app/conf/Config.groovy的配置文件。
注意看Config.groovy
// locations to search for config files that get merged into the main config // config files can either be Java properties files or ConfigSlurper scripts // grails.config.locations = [ "classpath:${appName}-config.properties", // "classpath:${appName}-config.groovy", // "file:${userHome}/.grails/${appName}-config.properties", // "file:${userHome}/.grails/${appName}-config.groovy"] // if(System.properties["${appName}.config.location"]) { // grails.config.locations << "file:" + System.properties["${appName}.config.location"] // } grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format grails.mime.types = [ html: ['text/html','application/xhtml+xml'], xml: ['text/xml', 'application/xml'], text: 'text-plain', js: 'text/javascript', rss: 'application/rss+xml', atom: 'application/atom+xml', css: 'text/css', csv: 'text/csv', all: '*/*', json: ['application/json','text/json'], form: 'application/x-www-form-urlencoded', multipartForm: 'multipart/form-data' ] // The default codec used to encode data with ${} grails.views.default.codec="none" // none, html, base64 // enabled native2ascii conversion of i18n properties files grails.enable.native2ascii = true // log4j configuration log4j { appender.stdout = "org.apache.log4j.ConsoleAppender" appender.'stdout.layout'="org.apache.log4j.PatternLayout" appender.'stdout.layout.ConversionPattern'='[%r] %c{2} %m%n' appender.errors = "org.apache.log4j.FileAppender" appender.'errors.layout'="org.apache.log4j.PatternLayout" appender.'errors.layout.ConversionPattern'='[%r] %c{2} %m%n' appender.'errors.File'="stacktrace.log" rootLogger="error,stdout" logger { grails="error" StackTrace="error,errors" org { codehaus.groovy.grails.web.servlet="error" // controllers codehaus.groovy.grails.web.pages="error" // GSP codehaus.groovy.grails.web.sitemesh="error" // layouts codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping codehaus.groovy.grails."web.mapping"="error" // URL mapping codehaus.groovy.grails.commons="info" // core / classloading codehaus.groovy.grails.plugins="error" // plugins codehaus.groovy.grails.orm.hibernate="error" // hibernate integration springframework="off" hibernate="off" } } additivity.StackTrace=false } // WAR dependency config grails.war.dependencies = [ "ant.jar", "ant-launcher.jar", "hibernate3.jar", "jdbc2_0-stdext.jar", "jta.jar", "groovy-all-*.jar", "springmodules-sandbox.jar", "standard-${servletVersion}.jar", "jstl-${servletVersion}.jar", "antlr-*.jar", "cglib-*.jar", "dom4j-*.jar", "ehcache-*.jar", "junit-*.jar", "commons-logging-*.jar", "sitemesh-*.jar", "spring-*.jar", "log4j-*.jar", "ognl-*.jar", "hsqldb-*.jar", "commons-lang-*.jar", "commons-collections-*.jar", "commons-beanutils-*.jar", "commons-pool-*.jar", "commons-dbcp-*.jar", "commons-cli-*.jar", "commons-validator-*.jar", "commons-fileupload-*.jar", "commons-io-*.jar", "commons-io-*.jar", "*oro-*.jar", "jaxen-*.jar", "xercesImpl.jar", "xstream-1.2.1.jar", "xpp3_min-1.1.3.4.O.jar" ] grails.war.java5.dependencies = [ "hibernate-annotations.jar", "ejb3-persistence.jar", ]
上面是源代码.它使用了Groovy's ConfigSlurper,类似于Java的属性文件,只不过他是使用纯粹的Groovy文件,你可以重复使用变量和正确的Java类型。
你可以在这里添加你自己的配置, for example:
foo.bar.hello = "world"稍后你可以在你的应用项目中访问这些设置。在大多数情况下你可以通过 GrailsApplication (在controllers and tag中的可用变量)对象来访问:
assert "world" == grailsApplication.config.foo.bar.hello
Grails也提供下面这些配置选项:
grails.enable.native2ascii = true默认为true.
grails.views.default.codec="none"默认为none。
log4j { appender.stdout = "org.apache.log4j.ConsoleAppender" appender.'stdout.layout'="org.apache.log4j.PatternLayout" appender.'stdout.layout.ConversionPattern'='[%r] %c{2} %m%n' appender.errors = "org.apache.log4j.FileAppender" appender.'errors.layout'="org.apache.log4j.PatternLayout" appender.'errors.layout.ConversionPattern'='[%r] %c{2} %m%n' appender.'errors.File'="stacktrace.log" rootLogger="error,stdout" logger { grails="error" StackTrace="error,errors" org { codehaus.groovy.grails.web.servlet="error" // controllers codehaus.groovy.grails.web.pages="error" // GSP codehaus.groovy.grails.web.sitemesh="error" // layouts codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping codehaus.groovy.grails."web.mapping"="error" // URL mapping codehaus.groovy.grails.commons="info" // core / classloading codehaus.groovy.grails.plugins="error" // plugins codehaus.groovy.grails.orm.hibernate="error" // hibernate integration springframework="off" hibernate="off" } }如果你更喜欢标准的 Log4j 属性文件样式配置 你可以使用Groovy的多行String替代:
log4j = ''' log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # ...remaining configuration '''
注意:Groovy的多行String是
''' '''
的形式。
一些有用的 loggers:
当有异常抛出,full trace 总是会写入 StackTrace logger,文件名叫做 stacktrace.log--当然你可以做任何你喜欢的改变通过grails-app/conf/Config.groovy文件,例如:
StackTrace="error,errors"
你可以改变成:
StackTrace="error,stdout"
可以完全废除stacktrace filtering 通过设置 grails.full.stacktrace VM 属性为 true:
grails -Dgrails.full.stacktrace=true run-app
所用的应用程序工件( artefacts)可以动态的添加 log 属性. 包括 domain classes, controllers, tag libraries 等等. 例如:
def foo = "bar" log.debug "The value of foo is $foo"
Logs命名 使用 规约 grails.app.<artefactType>.ClassName,例如:
# Set level for all application artefacts log4j.logger.grails.app="info, stdout" # Set for a specific controller log4j.logger.grails.app.controller.YourController="debug, stdout" # Set for a specific domain class log4j.logger.grails.app.domain.Book="debug, stdout" # Set for a specific taglib log4j.logger.grails.app.tagLib.FancyAjax="debug, stdout" # Set for all taglibs log4j.logger.grails.app.tagLib="info, stdout"
工件(artefacts) 名字通过规约来规定:
因为Grails 是构建在Java 技术 之上,配置data source 要求一些JDBC知识(并不是替代 Java Database Connectivity).
本质上, 如果你使用除HSQLDB以外的database , 你需要其对应的JDBC driver 。这里我们使用MySql。
首先你的下载JDBC driver,并把他放在项目中的lib目录下。
其次你得修改位于项目中的grails-app/conf/DataSource.groovy文件。
主要包括一下设置:
附上源代码:
dataSource { pooled = false driverClassName = "org.hsqldb.jdbcDriver" username = "sa" password = "" } hibernate { cache.use_second_level_cache=true cache.use_query_cache=true cache.provider_class='org.hibernate.cache.EhCacheProvider' } // environment specific settings environments { development { dataSource { dbCreate = "create-drop" // one of 'create', 'create-drop','update' url = "jdbc:hsqldb:mem:devDB" } } test { dataSource { dbCreate = "update" url = "jdbc:hsqldb:mem:testDb" } } production { dataSource { dbCreate = "update" url = "jdbc:hsqldb:file:prodDb;shutdown=true" } } }
典型的MySQ配置:
dataSource { pooling = true dbCreate = "update" url = "jdbc:mysql://localhost/yourDB" driverClassName = "com.mysql.jdbc.Driver" username = "yourUser" password = "yourPassword" }
有时你需要使用JNDI,Grails支持JNDI:
dataSource { jndiName = "java:comp/env/myDataSource" }
DataSource 的dbCreate 属性定义是非常重要的 ,因为他规定了Grails 在运行时怎样尝试数据库表格 ,可选的操作:
dataSource { dbCreate = "create-drop" // one of 'create', 'create-drop','update' }
当然,假如你不想使用上面所说的配置,你可以删除
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop','update'
}
就可以了。