在本文中将会涉及到:
使用 CliBuilder 来实现对命令行选项的支持,脚本执行时所需要的参数将通过命令行选项的方式传递。 使用
GroovyClassLoader 加载 Groovy class。 使用 AntBuilder 来构建 Jar 包。
开始之前
关于本文
也许您写了一些有趣或实用的 Groovy 脚本并希望与您的朋友分享,可是您并不想强迫他们安装 Groovy,所以您也许想要做一个小工具让您的朋友们能够用它编译您的 Groovy 脚本并且生成一个可执行的 Jar 包。本文将介绍如何制作一个小工具让您的 Groovy 脚本能够在没有安装 Groovy 的环境下也能被即时编译和打包成为可执行的 Jar,并通过此过程介绍 Groovy 的一些有趣的特性。
在本文中,我们将设计并实现一个命令行工具,并通过它来完成对 Groovy 脚本的即时编译和打包。我们将使用 CliBuilder 来实现程序对命令行的处理;使用 AntBuilder 来处理打包的问题;使用 ">FileSystemCompiler 类来实现对 Groovy 脚本文件的编译。
目标
通过本示例了解 Groovy 中 CliBuilder 的使用方法,以及 AntBuilder 在 Groovy 中的应用。
先决条件
Eclipse IDE Groovy
plugin for Eclipse Apache Ant Java library(您可以在这里找到下载地址 http://ant.apache.org/bindownload.cgi)
系统要求
由于 Eclipse IDE 和 Groovy 语言都是跨平台的,所以您可以在任何平台上编写本示例中的程序,并将它运行在任何平台上。
利用 CliBuilder 设计命令行程序
用 Groovy 来编写脚本是开发跨平台工具的一个不错的途径。随着脚本复杂程度的不断增长,您可能需要在您的脚本中处理命令行选项。而处理这些选项或参数并且根据情况显示相应的帮助信息可能会是件麻烦事。 Groovy 捆绑了 Apache Commons CLI 库作为它的一部分,然而它同时也提供了一个使用起来简单得多的 CliBuilder。那么,接下来我们看看该如何使用它。
为程序设置命令行选项
清单 1. 创建 CliBuilder 实例及定义命令行选项
// 创建 CliBuilder 实例,并定义命令行选项 def cmdline = new CliBuilder(usage: 'GroovyPackman -[chflms] [date] [prefix]') cmdline.h( longOpt: 'help', required: false, 'show usage information' ) cmdline.d( longOpt: 'destfile', argName: 'destfile', required: false, args: 1, 'jar destintation filename' ) cmdline.m( longOpt: 'mainclass', argName: 'mainclass', required: true, args: 1, 'fully qualified main class' ) cmdline.c( longOpt: 'groovyc', required: false, 'Run groovyc' ) cmdline.s( longOpt: 'sourcepath', argName: 'sourcepath', required: true, args: 1, 'fully path to the mainclass. Must be specified with .groovy file path when -c option used.')
在以上代码段中,我们首先创建 CliBuilder 的实例。CliBuilder 拥有一个叫做 Usage 的属性,可以用它来显示程序的使用说明等信息。在这里,它作为参数传递给构造函数将可以告诉程序的使用者有哪些选项可以使用。接着,我们使用名字为一个字母的方法来定义命令行选项,longOpt 属性允许选项被指定为 -h 或 --help 均可。argName 属性用来指定在使用说明中显示的选项的参数名。而 args 属性用来指定选项所需的参数个数。required 属性用来告诉命令行解析器当前选项是否是必须的。函数中最后一个参数用来指定该选项的描述信息。
Groovy 语言中闭包(closure)是一个非常重要的概念,它更象是一个“代码块”或者方法指针,代码在某处被定义然后在其后的调用处执行。
Groovy 为我们提供了 with 方法,它允许闭包被对象的引用本身所调用,这是通过把对象赋值给闭包的 delegate 属性并且作为参数传递给闭包来实现的。使用 with 方法有时可以帮助我们减少代码量,在此我们看看使用 with() 方法定义各项参数与代码清单 1 所使用的方法有何不同。
清单 2. 使用 with 方法后的代码
def cmdline = new CliBuilder(usage: 'GroovyPackman -[chflms] [date] [prefix]') // 使用 Object 上的 with 方法省去 cmdline 对象的限定 cmdline.with { h longOpt: 'help', required: false, 'show usage information'; d longOpt: 'destfile', argName: 'destfile', optionalArg: true, args: 1, 'jar destintation filename'; m longOpt: 'mainclass', argName: 'mainclass', required: true, args: 1, 'fully name of main class'; c longOpt: 'groovyc', required: false, 'Run groovyc'; s longOpt: 'sourcepath', argName: 'sourcepath', required: true, args: 1, 'fully path to the mainclass. Must be specified with .groovy file path when -c option used.'; }
这样,我们为程序设置了命令行入口。其中:
使用“-h “或”--help”来显示使用帮助信息。 使用”-d”或”--destfile”来目标文件名用来作为生成的 .jar 文件名,这是一个可选项。 用”-m”或”--mainclass”来指定主类的全名,未指定”-d”选项时将被作为目标 Jar 包的文件名。 通过使用"-c"选项来控制是否执行编译过程,是一个可选项。 当命令行中指定了"-c"时,"-s"或"--sourcepath"需指向要被编译的脚本(包)所在的目录;未指定"-c"时需指向 .class 文件所在的目录。
在本文的最后一章中您将看到通过这个命令行工具(在本文中被命名为:GroovyPackman)编译打包脚本的实例。