Groovy 2.0 新特性之:模块化的 Groovy 以及扩展

jopen 12年前

更加模块化的 Groovy

关于 Groovy 2.0 新特性,最后我们要讲到的便是模块化。和 Java 一样,Groovy 不只是一个编程语言,同时还提供一组不同的 API 用于不同用途,包括:模板、Swing UI 构建、Ant 脚本、JMX 集成、SQL 访问和 Servlet 等到。Groovy 之前是将这些特性和 API 放在一个非常大的 jar 包中,但是很多时候我们并不需要使用到所有的功能,例如我们只想要 Servlet 和模板引擎用来编写 Web 应用,而用 Swing 构建器来开发桌面应用。

Groovy 模块

因此该版本中提出的模块化其实就是将原来一个很大的 Groovy jar 包分成多个功能独立的小的 jar 包文件,而核心的 Groovy jar 包只有原来的一半还不到的大小。Groovy 2.0 提供的模块包括:

  • Ant: 用于对 Ant 任务进行脚本化处理,主要用于管理任务
  • BSF: 集成了 Apache Bean Scripting 框架
  • Console: 包含 Groovy Swing 控制台的模块
  • GroovyDoc: 用于生成 Groovy 和 Java 类的文档
  • Groovysh: Groovysh 命令行 shell
  • JMX: 用于 JMX 的集成
  • JSON: 生成和解析 JSON 数据
  • JSR-223: 通过 JDK 6+ 的 javax.scripting 在 Java 应用中集成 Groovy
  • Servlet: 用于编写 Groovy 脚本 Servlet 和模板
  • SQL: 查询关系数据库
  • Swing: 构建 Swing UIs 应用
  • Templates: 使用模板引擎
  • Test: 测试支持,类似 GroovyTestCase
  • TestNG: 可在 Groovy 中编写 TestNG 测试
  • XML: XML 处理包

在 Groovy 2 下,你可挑选你感兴趣的模块包,而不是将所有 jar 文件放到类路径中。当然 Groovy 2 同样提供了打包所有模块的 jar 包,同时 Groovy 2 还提供了在 JDK 7 下支持 "invoke dynamic" 所需的 jar 包。

扩展模块

你可以为 Groovy 编写自己的扩展模块。在将 Groovy 切分成很多小模块的同时,Groovy 2 也允许创建新模块。扩展模块可为其他类提供实例和静态的方法。Groovy 使用这个机制对 JDK 进行修饰,例如为 String、File、流等类添加一些有用的新方法。例如为 URL 类增加 getText() 方法,你就可以调用这个方法来获取 URL 对应的文本内容。必须注意的是你模块中的扩展方法也同样会被静态类型检查器所支持。下面让我们来介绍如何为已有的类增加新的方法。

新增实例方法

为已有的类增加新方法,你首先必须创建一个助手类 (Helper) 包含了这些要添加的方法。在 Helper 类中所有的这些方法都必须是 public 和 static 修饰的。而且这些方法的第一个参数是所扩展类的实例,其他的参数则是即将传递给扩展方法的参数。

加入我们要给 String 类增加一个 greets() 方法,该方法将打印一个打招呼的信息给传递进来的人名,代码如下:

assert "Guillaume".greets("Paul") == "Hi Paul, I'm Guillaume"

然后我们需要创建一个 Helper 类:

package com.acme    class MyExtension {      static String greets(String self, String name) {          "Hi ${name}, I'm ${self}"      }  }

新增静态方法

对于静态扩展方法所用的机制和约定是一致的,假如我们要给 Random 类增加一个在两个数值之间取随机数的方法:

package com.acme    class MyStaticExtension {      static String between(Random selfType, int start, int end) {          new Random().nextInt(end - start + 1) + start      }  }

使用的方法如下:

Random.between(3, 4)

扩展模块描述符

一旦你编写好了 Helper 类(不管是 Groovy 还是 Java 都可以),你需要为你的模块创建一个描述。你需要创建一个名为 org.codehaus.groovy.runtime.ExtensionModule 的文件,该文件放在模块压缩包的 META-INF/services 目录下,该文件的目的就是为了告诉 Groovy 运行环境关于你模块的名称和版本信息,同时包括使用逗号隔开的多个要扩展的 Helper 类,下面是上面测试模块的描述配置:

moduleName = MyExtension  moduleVersion = 1.0  extensionClasses = com.acme.MyExtension  staticExtensionClasses = com.acme.MyStaticExtension

有了这个扩展模块的描述,你就可以在代码中使用扩展方法,无需导入任何类、包等内容,这些扩展模块会自动的注册到 Groovy 的运行环境。

抓取扩展

通过在代码中使用 @Grab 注解,你可以获取来自 Maven 资料库的依赖信息。使用 @GrabResolver 注解可以为你的依赖指定位置。如果你通过这个机制来抓取模块的依赖性,扩展的方法将会自动被安装。但你的模块名和版本必须和 artifact 中的保持一致。

英文原文,OSCHINA原创翻译

<