Grape——适合Groovy的高级打包引擎
为了继续AST转换的讲解,我们需要了解一下Grape——在Groovy脚本中增加并使用依赖的一种机制。Groovy脚本可能需要某些库:这可以通过显式声明@Grab,或是通过Grape.grab()方法调用来实现,这样运行时就会找到所需的JAR文件。借助于Grape,我们可以轻松发布脚本而无需依赖,在首次使用脚本时再去下载这些依赖并缓存起来。在背后,Grape使用了Ivy和Maven仓库(包含了脚本所需的库)。
假如你想要获得Java 5文档所引用的所有PDF文档的链接,你可能想通过Groovy XmlParser来解析HTML页面,就好象页面是个兼容于XML的文档。可实际上HTML并不是兼容于XML的,因此你会使用兼容于SAX的 TagSoup将HTML转换为格式良好的XML。如果使用了Grape,在运行脚本时你甚至都无需配置类路径,只需通过Grape获取到TagSoup 库即可:
2
3 // find the PDF links in the Java 1.5.0 documentation
4
5 @Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='0.9.7')
6
7 def getHtml() {
8
9 def tagsoupParser = new Parser()
10
11 def parser = new XmlParser(tagsoupParser)
12
13 parser.parse("http://java.sun.com/j2se/1.5.0/download-pdf.html")
14
15 }
16
17 html.body.'**'.a.@href.grep(~/.*\.pdf/).each{ println it }
18
再来看个示例:使用Jetty Servlet容器通过寥寥数行代码暴露Groovy模板:
2
3 import org.mortbay.jetty.servlet.*
4
5 import groovy.servlet.*
6
7 @Grab(group = 'org.mortbay.jetty', module = 'jetty-embedded', version = '6.1.0')
8
9 def runServer(duration) {
10
11 def server = new Server(8080)
12
13 def context = new Context(server, "/", Context.SESSIONS);
14
15 context.resourceBase = "."
16
17 context.addServlet(TemplateServlet, "*.gsp")
18
19 server.start()
20
21 sleep duration
22
23 server.stop()
24
25 }
26
27 runServer(10000)
28
Grape会在脚本首次运行时下载Jetty及其依赖并将其缓存起来。我们在8080端口上创建一个新的Jetty Server,接下来在上下文的根路径上暴露Groovy的TemplateServlet——Groovy拥有强大的模板引擎机制。启动服务器并运行一段时间,用户每次访问http://localhost:8080/somepage.gsp时服务器都会显示somepage.gsp模板——这些模板页面应该放在与服务器脚本相同的目录下。
除了注解以外,Grape还可以方法调用的方式使用。你还可以通过命令行使用grape命令来安装、展示及解析依赖。请参考其文档来了解关于Grape的更多信息。