Google 刚刚宣称(编者:此次更新时间为09年4月9日)他们的Google App Engine 云计算平台现在已经支持了除了Python以外的其他的语言:即Java和Groovy!
现在,你可以通过Groovy高效的编写你的Google App Engine 应用了。
几星期以前,SpringSource Groovy团队和Google App Engine Java 团队紧密携手,仔细的处理了大量的细节问题,以确保这门获奖的颇为流行的基于JVM的动态语言--Groovy可以很好的运行在这个精彩的平台上。他们针对那些限制严格以及有很强的安全管理政策的领域为Groovy编写了一些补丁,之后在预定日期发布了 Groovy 1.6.1 更新。在新版本中,你可以通过直接在你的 WEB-INF/lib 目录下部署 "groovy-all" JAR 文件开始通过 Groovy 编写你的应用,并运行在 Google 的内核上。
在文本的其余部分,我将带你通过一些简单的步骤来创建你的***个基于Groovy的App Engine Web应用。由于他们在App Engine 的文档里列的很清楚,这里我会跳过基本的安装步骤,并且我将着重于构建Groovy 应用本身的方方面面。就像你即将看到的一样,这会相当的轻松。
开始入门
首先,显然,你得在 Google App Engine 上注册一个Google帐号,以便你可以在该平台创建应用,并能将其上载到云端。你也会需要下载并安装Google App Engine Java SDK。上述所有的步骤,你应该参看在线文档,你可以在里面找到所有你需要的细节。
一旦 SDK 安装完毕,为了本次课程所需,你还应该下载并安装 Groovy1.6。 本文前面的步骤需要我们用Groovy编译一个servlet,你会用到 Groovy,但是在余下的部分,由于我们将使用Groovy在运行时自编译的 Groovlets,所以你就不在需要它了。
有了 Java, SDK, Groovy 安装,我们就可以继续了,通过 Groovy-ready 项目模板建立一个新的项目。下载摘要,解压到一个你喜欢的目录下,下面让我们看看里面都有什么!这感觉就像拆开圣诞礼物的包装,对吗?
我把这个模板项目解压到了一个叫 gaedemo 的目录下。在这个目录的根,你会看到一个包含着所有我们的 Groovy 和 Java 源代码需要去编译的 src 目录 (servlets, domain classes, utility classes, 等等)。 deploy 目录基本上同我们将要输出的webapp一致:你会看到一个包含所有编译过的类的 classes 目录, 存放各种 JAR 文件 lib 目录(Groovy JAR 和 Google App Engine 自己的 API JAR 一样), 以及存放 Groovlet 的 groovy 目录。在本文的第二部分,我们将开发这些 Groovlets。 你也当然会注意到 appengine-web.xml 文件,它是一个 App Engine 特殊描述器。你可以能找到标准的 web.xml, 在它里面,你可以定义你自己的 servlets, 你的映射关系以及其它的东西。
编译类
在对这个项目结构有个大概的印象之后,让我们关键的文件都包括哪些.就让我们从 build.groovy 文件开始把。我利用 Groovy 的 AntBuilder (构建在Ant之上的一个轻量级的领域特定语言) 替代了直接创建一个 Ant 编译文件:
def ant = new AntBuilder().sequential { |
我们实例化一个 AntBuilder, 为目标目录 WEB-INF 创建一个属性,我们定义了 groovyc 的Ant任务,利用任务为 Groovy 代码和指明了编译器,这个编译器(译者:实际上就是 org.codehaus.groovy.ant.Groovyc ,这是个Java类,显然它的作用就是把 Groovy 的代码翻译成Java代码,剩下的事情就由 javac 来搞定了) 通过将编译Java类的任务委托给 javac 编译起而做到联合编译 Groovy 及其 Java 的依赖类 -- 当然,是否真能做到让这两种语言无缝集成,还有代证明。在定义完这个任务之后,将classpath设成 WEB-INF/lib 下面的JAR文件和编译过的 classes,我们就可以启动来编译源代码了。
为了执行这个 build 文件, 利用你已经安装的 Groovy, 你只需要下面的命令去编译你的项目
groovy build |
设置项目描述符
在 appengine-web.xml 文件中包含着一些Google App Engine 部署你项目时需要的原数据。尤其的,这里是你定义应用的名称以及版本号的地方,你需要将你自己应用的名称更新进去。到现在,我们的描述符看起来就像下面的样子:
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> |
#p#
创建你***个 Servlet
在跳入 Groovlets 之前,我们将从一个不错的老 Servlet 开始!由于Google App Engine 支持 Servlet 2.5 规范,我们可以些一个简单的 "Hello World!" Servlet。 我们在 src 目录创建一个名为 HelloServlet.groovy 的文件,它包含下面的代码:
import javax.servlet.http.* class HelloServlet extends HttpServlet { |
虽然你会注意到 Groovy 提供的更简单的语法: 少了分号, public 关键字, 属性的 getter/setter 以及分号的省略都是可选的,但是这看起来更想一个普通 Java servlet。
下一步: 我们需要在 web.xml 引用这个 servlet,就像这样:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> |
一旦 servlet 配置完毕,别忘了用我们的小 build 文件来编译 servlet
groovy build |
把你的应用上载到云端
如果你的 Google App Engine SDK 配置正确,你应该可以在你的项目根目录处运行下面的命令:
appcfg.sh update deploy/ |
***次运行时,这个命令会提示验证你的权限,以后再调用的时候它将会打印类似下面的输出:
Reading application configuration data...
Beginning server interaction for myowngroovy...
0% Creating staging directory
5% Scanning for jsp files.
20% Scanning files on local disk.
25% Initiating update.
28% Cloning 5 application files.
40% Uploading 1 files.
52% Uploaded 1 files.
90% Deploying new version.
95% Will check again in 1 seconds
98% Closing update: new version is ready to start serving.
99% Uploading index definitions.
Update complete.
Success.
Cleaning up temporary files...
如果你看到了 “Success” 这个字, 那是当然的了,因为所有的事情进行十分顺利,而你的应用也已经准备就绪了。 通过类似下面的 URL 来访问这个 servlet (根据你应用的名字而所有不同): http://myowngroovy.appspot.com/hello,你将会看到这条消息:“Hello Google App Engine Groovy!”
求救于 Groovlets
利用 Groovy 语言编写老 Java servlet 的确很让人兴奋,对吗? 这种感觉就像你***次作出了一个servlet 一样,对吗?不是那么的一样,它好像几乎已经不那么时髦了。幸运的是, Groovy 以及 Groovlets 来了。
在极小的容器中, Groovlets 只不过就是存放在 WEB-INF/groovy 目录下的 Groovy 脚本,Groovy servlet 调度器被用来(译者:在运行时) 编译和渲染这些脚本。
首先,让我们更新 web.xml,增加一个 GroovyServlet, 以及一个 URL 映射,使得所有能被模式 *.groovy 匹配上的 URL 都会转向它。
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> |
一点搞定这个,我们马上就在 WEB-INF/groovy 下创建我们***个 Groovlet 脚本, hello.groovy:
html.html { |
这个 Groovy 脚本采用了一个名为 html 的变量名范围(译者:原文是 variable bound, 我估计是类似于 包路径或者名称空间的概念)来同 MarkupBuilder 的实例进行绑定。它(译者:指 MarkupBuilder)是一个为了创建各种 XML 或 HTML 标记又小又有用的领域特定语言。 MarkupBuilder 用更清晰更 Groovy 的语法替代了依靠一行一行通过 println 语句输出HTML字符串的形式。 当然,你可以通过混合一些循环和条件让这个标记语言更加动态。
在重新上传这个应用之后,你现在可以通过 http://myowngroovy.appspot.com/hello.groovy 来访问这个 Groovlet 了。这次你就不需要编译任何东西了,因为编译这些 Groovlets 脚本是 GroovyServlet 的事情。
简单吗?
接下来...
我们仅仅是触及了一些很肤浅的情况,但是这足以让你对 Groovy 入门了。在你在 Google App Engine APIs 探索的同时,这里还有一些你可以通过你的 Groovlets 和 servlets 使用的破有意思的服务:
◆一个数据存储的接口 (datastore API),你可以通过底层的无 schema 的API 或者 JDO 存储你的对象
◆一个用来可以进行各种转换和应用滤镜图像接口
◆一个用来发送电子邮件的邮件接口
◆一个用来缓存重量数据结构或者计算结果的内存缓冲接口(memcache API)
◆一个用来获取远端 URL 内容的 URL 获取接口
◆一个使用 Google 用户帐户来进行验证的用户接口
当然,所有的这些服务都可以被你的 Groovlet 脚本调用。 你也可以使用第三方库并把他们放在你的 WEB-INF/lib 目录里面。研究一下更多的可用接口,看看在它们上面构建一个瘦 Groovy 层是否会让它们更容易被使用,通过更Groovy的方式,这会很有趣。
如今, Groovlets 和普通的 servlet 被彻底的支持了,但是例如, Grails 应用还是不能跑在当前版本的 Google App Engine 上。我们将继续和 Google App Engine 团队一道努力,以便让你可以通过 Grail 让更多的高级应用(译者:和Groovy)跑的一样好。
【编辑推荐】