让Grails运行起来的第一步是安装发行包。请按照如下步骤:
export GRAILS_HOME=/path/to/grails
来设置环境变量 我的电脑/属性/高级/环境变量
中添加相同的环境变量 bin
目录到 PATH
环境变量中:
export PATH="$PATH:$GRAILS_HOME/bin"
我的电脑/属性/高级/环境变量
中的 Path
环境变量 如果Grails正常工作了那么你可以在终端窗口中键入 grails
命令并看到如下简单的输出:
Welcome to Grails 1.0 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /Developer/grails-1.0
No script name specified. Use 'grails help' for more info
尽管Grails开发团队试图将从Grails 1.0.x升级到Grails 1.1时带来的影响降到最低限度,但仍然有一些事项需要你认真考虑。重大变化描述如下。
Grails 1.1现在和Groovy 1.6协同工作并且不再支持针对Groovy 1.5的代码编译。如果你有一个使用Groovy 1.5编写的组件库,在将它用于Grails 1.1之前,你需要针对Groovy 1.6来重新编译它。
Grails 1.1现在不再支持JDK 1.4,如果你希望正常使用Grails,那么建议你继续使用Grails 1.0.x系列直到你能够升级你的JDK。
1) 为了系统的一致性,设置项 grails.testing.reports.destDir
已经被重命名为 grails.project.test.reports.dir
。
2) 下列设置已经从 grails-app/conf/Config.groovy
文件中移到了 grails-app/conf/BuildConfig.groovy
文件:
grails.config.base.webXml
grails.war.destFile
grails.war.dependencies
grails.war.copyToWebApp
grails.war.resources
3) 自从Java 5.0成为基线起, grails.war.java5.dependencies
选项已不再被支持(见上文)。
4) jsessionid的使用(现在被认为是有害的)默认是禁用的。如果你的应用程序需要用到jsessionid,你可以重新启用它,在 grails-app/conf/Config.groovy
文件中添加如下设置:
grails.views.enable.jsessionid=true
5) 用来配置Log4j的语法已经改变了。看看用户指南的 登录 一章可以获得更多信息。
Grails 1.1默认将不在你的 PROJECT_HOME/plugins
目录下储存插件。这可能导致你的应用程序出现编辑错误,解决办法是重新安装所有的插件或者在 grails-app/conf/BuildConfig.groovy
文件中设置下列属性:
grails.project.plugins.dir="./plugins"
1) 如果你先前使用的是Grails 1.0.3或以下的版本,那么下边用于从GRAILS_HOME导入脚本的语法将不再被支持:
Ant.property(environment:"env") grailsHome = Ant.antProject.properties."env.GRAILS_HOME"
includeTargets << new File ( "${grailsHome}/scripts/Bootstrap.groovy" )
取而代之的是 grailsScript
方法,它能导入一个命名的脚本:
includeTargets << grailsScript( "Bootstrap.groovy" )
2) 由于升级到了Gant,所有对变量 Ant
的引用应该改为 ant
。
3) 项目的根目录不再存于classpath中,像如下的资源加载方式将无法使用:
def stream = getClass().classLoader.getResourceAsStream("grails-app/conf/my-config.xml")
但是你可以使用Java文件API以及 basedir
属性来完成如上操作:
new File("${basedir}/grails-app/conf/my-config.xml").withInputStream { stream -> // read the file }
run-app-https
和 run-war-https
这两个命令已经被取消了,取而代之的是 run-app 命令带上特定的参数:
grails run-app -https
1) 枚举类型现在可以使用它们的String值来映射,而不再是ordinal值。当然你也可以通过如下方式改变你的映射来还原为旧的习惯:
static mapping = { someEnum enumType:"ordinal" }
2) 双向的一对一关联现在可以使用在所有者端的一个单列和一个外键引用来映射。你不需要做任何修改,除非你想删除在相反端包含了重复数据的那一列。
接收到的XML请求现在不能被自动解析了。要启用对REST请求的解析,你需要在URL映射中使用 parseRequest
变量:
"/book"(controller:"book",parseRequest:true)
其次,你也可以使用新的 resource
变量来开启默认解析:
"/book"(resource:"book")
要创建一个Grails应用程序你首先需要熟悉 grails
命令的使用,使用方式如下:
grails [命令名称]
假如你需要执行的命令是 create-app:
grails create-app helloworld
这将创建一个新的目录,其中包含了helloworld这个项目。你现在可以在终端里导航到这个目录:
cd helloworld
要实现经典的"hello world!"例子你可以运行 create-controller 命令:
grails create-controller hello
这将在 grails-app/controllers
目录中创建一个名为 HelloController.groovy
的控制器(参见控制器一章获得更多内容)。
控制器能用来处理web请求并用来实现“hello world!”的例子,我们的实现代码如下:
class HelloController {
def world = {
render "Hello World!"
}
}
完工。现在使用另一个称为run-app的新命令来启动容器:
grails run-app
这将在8080端口开启一个服务器,现在可以通过http://localhost:8080/helloworld
这个URL来访问你的应用程序了。
你将看到如下截图所示的内容:
这是由 web-app/index.gsp
文件所呈现的Grails介绍页面。你会注意到它已经发现了你的控制器的存在,点击链接来访问控制器,我们可以看到浏览器窗口中打印除了“Hello World!”的文本。
目前用于Groovy和Grails开发的IDE中,最成熟、最全面的是IntelliJ IDEA 7.0和它的JetGroovy插件。在大型项目中,Grails团队优先推荐使用IDEA。
由于Grails关注的是简洁性,所以我们可以使用一些更简单的编辑器,例如在Mac环境下的TextMate,它对Groovy/Grails有着优秀的支持,可以从Texmate bundles SVN获得它。
对于Eclipse,Groovy Eclipse 插件提供了语法高亮和代码自动完成等功能。
在Grails的Wiki上有更多关于Groovy Eclipse插件的 详细讨论。
Grails为你自动创建了用于Eclipse的.project
以及 classpath
文件,所以要在Eclipse中导入一个Grails项目,只需在“Package Explorer”中点右键并选择“Import”,随后选择“Existing project into Workspace”并“Browse”你的项目位置。
接着顺序点击“Ok”和“Finish”即可完成项目的导入和安装。
Grails也将自动安装一个项目对应的“Run Configuration”配置,随后可以在Eclipse的“Run”菜单中来使用它运行Grails。
Grails使用“约定优于配置”原则来配置自己。这通常意味着文件的名称和位置被用来替代明确的配置,因此你需要熟悉Grails提供的目录结构。
以下是大致目录结构并链接到相关的章节:
grails-app
- Groovy源码的顶级目录
conf
- 源配置。 controllers
- Web控制器 - MVC模式中的C层。 domain
- 应用域。 i18n
- 国际化(i18n)支持。 services
- 服务层。 taglib
- 标记库。 views
- 视图,包含了Groovy服务器页面(GSP)。 scripts
- Gant脚本。 src
- 源文件目录
groovy
- 其他的Groovy源文件 java
-其他的Java源文件 test
- 单元测试和集成测试。
Grails应用程序可以使用 run-app 命令来运行在内置的Jetty服务器上,这个命令将默认在8080端口上启动一个服务器:
grails run-app
当然你也可以使用 server.port
变量来指定其他端口:
grails -Dserver.port=8090 run-app
更多关于 run-app 命令的信息可以在参考指南中找到。
Grails 中的 create-*
系列命令可以为你在 test/integration
目录内创建集成测试代码框架。当然你还得自己来填写有效的逻辑测试代码,更多的信息可以参考 测试 一章。如果你要执行测试代码,那么可以运行 test-app 命令:
grails test-app
Grails也自动生成了用于Ant的 build.xml
文件,它可以委托Grails的 test-app 命令来运行测试代码:
ant test
当你使用如CruiseControl这样的持续集成平台来自动构建Grails应用程序时,使用Ant的方式将非常有用。
Grails应用程序是通过Web应用程序档(WAR文件)的格式来部署的,它使用 war 命令来执行这个部署任务:
grails war
这将在你的项目根目录中产生一个WAR文件,你可以参照你的容器指南来部署它。
绝对不要使用 run-app 命令来作为部署的命令,因为它使Grails能够在运行期间自动重载,但这将带来许多性能和扩展性问题。
部署好Grails之后,你应该为你的容器JVM设置 -server
选项来分配足够的内容。一个较好的VM设置应该像这样:
-server -Xmx512M
Grails提供了许多像 create-controller 和 create-domain-class 这样方便的命令,可以使用它们来为你创建 控制器 等各种类型的工件。
这只是为了方便你进行开发,你也可以随意使用喜欢的IDE或文本编辑器来完成同样的工作。
例如,一个应用程序的基础部分是 域模型 ,我们可以像这样创建它:
grails create-domain-class book
这将在 grails-app/domain/Book.groovy
文件中创建一个域类,内容如下:
class Book { }
还有许多类似 create-*
这样的命令,你可以在命令行参考指南中了解它们
Grails支持相当广泛的容器,如下:
一些容器还有不少Bug,但在多数情况下它们都能工作的很好。在Grails的wiki站点你能找到一份 开发中已知问题列表 。
要使用Grails快速开始,经常用到的一个特性叫做 脚手架 ,它可以用来生成一个应用的骨架。要开始这样做,你可以使用 generate-*
这样的命令,如 generate-all 可以用来生成一个 控制器 以及相关的 视图 :
grails generate-all Book