5月14日Grails1.1.1发布,其中一个最振奋的特性就是可以支持Google App Engine开发了(通过插件的方式)。第一时间我试用了Grails这个最新版本,但因为在使用过程中还有些问题,今天才解决,所以现在把如何用Grails开发appengine项目为大家演示一下。
第一步:你必须有一个google账户,这样才能注册appengine账户
如果已经有google账户,到这里http://appengine.google.com申请appengine。
tip:在初次创建项目时需要手机验证,输入中国的手机号码前加 +86
第二步:下载Grails 1.1.1和下载Appengine的JavaSDK
http://grails.org/ Grails首页就有
Appengine的JavaSDK这个非常重要,也非常关键,而且关键的是你在AppEngine的官方下载页面是根本下载不到的。
必须到这里下载,http://code.google.com/p/googleappengine/ 那个Java版的SDK appengine-java-sdk-1.2.1.zip
第三步:新建一个Grails项目
grails create-app first-app
第四步: Grails项目名字和appengine名字的映射关系
你的Grails项目名字最好和你在appengine上的项目名字一致,否则你需要在项目中的Config.groovy文件里配置你在appengine部署的项目名字。
例如:google.appengine.application="petclinic-grails"
第五步: 卸载Hibernate插件
grails uninstall-plugin hibernate
因为Google App Engine不支持 GORM ,而且Appengine提供的数据库服务器需要jdo来访问。 所以要卸载hibernate,而使用jdo。
tip:这里卸载了HIbernate插件,但你在使用 generate-all命令生成gsp页面时可能会报错,因为Grails的gsp模板文件中使用了hibernate的一些class。
所以你需要吧hibernate插件中lib目录下的jar文件都拷贝到你在项目lib目录中。这是我的解决方案,管用,但不是官方的。*_-
报错信息如下:
groovy.lang.GroovyRuntimeException: Failed to parse template script (your template may contain an error or be trying to use expressions not currently supported): startup failed, Si
mpleTemplateScript1.groovy: 2: unable to resolve class org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor
@ line 2, column 16.
第六步: 安装AppEngine 插件
grails install-plugin app-engine
安装完成app-engine插件后你需要配置一下appengine sdk的环境变量。
set APPENGINE_HOME=D:\appengine-java-sdk-1.2.1
第七步: 运行项目
grails app-engine run
这里你可以做一些简单的应用...
第八步: 打包项目
生成一个版本号,这是appengine需要的
grails set-version 1
打包项目
grails app-engine package
将grails项目打包成appengine格式。这里需要验证你在google appengine上的账户和密码。
$APPENGINE_HOME/bin/appcfg.cmd update ./target/war
tip:这里使用appengine的appcfg.cmd 打包项目是可能会报下面的错误。
C:\dev\grails\grails-1.1.1\projects\first-app>%APPENGINE_HOME%\bin\appcfg update .\target\war
Email: **********
Reading application configuration data…
Bad configuration: XML error validating .\target\war\WEB-INF\datastore-indexes.xml against C:\dev\gae\appengine-java-sdk-1.2.1\docs\datastore-indexes.xsd
Caused by: cvc-elt.1: Cannot find the declaration of element 'datastore-indexes'.
解决方法是删除这个datastore-indexes.xml 文件,看这个文件的名字应该是数据库的索引标示不知道问什么会报错,只能等appengine插件更新后彻底解决这个问题了。
第九步: 将Grails项目部署到App Engine上
$APPENGINE_HOME/bin/appcfg.sh update ./target/war
grails app-engine deploy
虽然很简单,但还是有些问题,而且不能使用GORM确实还有得不太习惯,不知道在具体做一些应用时还有什么掣肘的问题??
最后打个广告,在Appengine上Grails终于领先rails一小步,我再次呼吁搞Java的如果想玩脚本语言极限开发快速开发TDD开发你最好的选择是Grails而不是rails。Google App Engine已经选择了Grails,你呢?