使用Groovy作为脚本语言

时间:2010-04-15 13:46:30

标签: java groovy scripting-language

我更喜欢使用脚本语言来完成简短的任务,比如一个非常简单的http机器人,批量导入/导出数据到某个地方等等......基本的丢弃脚本和简单的东西。关键是,脚本语言只是编写快速程序的有效工具。至于我此时对Groovy的理解......

如果您要使用Groovy进行编程,并且您不想编写快速脚本,那么您是否不会被迫回到常规java语法(我们知道与脚本语言相比如何进行复杂处理)为了做更复杂的事情?例如,如果我想做一些http脚本,我不会直接使用java语法来调用Commons HttpClient吗?对我而言,脚本语言的意义在于快速键入和强制构造。这是另一回事,似乎没有任何动机可以开发基于groovy的库,因为已经有这么多优秀的Java,因此使groovy看起来是一种具有次要脚本功能的Java依赖语言。

所以现在我想知道我是否可以将Groovy作为脚本语言切换,或继续使用更常见的脚本语言,如Perl,Python或Ruby。

6 个答案:

答案 0 :(得分:12)

@ Zombies,让我向您展示我最近写的一个脚本的快速示例:

def fetch(build, toFile) {
    new FTPClient().with {
        connect ftpServer
        enterLocalPassiveMode()
        login ftpUser, ftpPassword
        changeWorkingDirectory "/var/staging/revision-${build}"
        fileType = FTPClient.BINARY_FILE_TYPE
        toFile.withOutputStream { ostream -> 
            retrieveFile "build-${build}.zip", ostream 
        }
        disconnect()
    }
}

它使用了commons-net API,但我认为你会同意它比同类Java程序有更清晰的语法。因此,我不认为使用Java API会破坏使用脚本语言的目的。此外,它可以帮助您利用Java API的现有知识,因此是一种非常实用的方法。

答案 1 :(得分:5)

Groovy的一个目标是与Java实现透明的互操作性。 Groovy是设计“具有脚本功能的Java依赖语言”。但是,我不认为这些功能很小 - Groovy有许多静态编程语言(如Java)中没有的功能。

总结:如果您根本不关心Java,那么请使用更通用的脚本语言,例如Python或Perl。如果你想以脚本方式使用Java代码库,那么Groovy是个不错的选择。

答案 2 :(得分:5)

Groovy可以非常方便地编写脚本。最近我需要一个脚本来将Maven依赖项提取到lib目录中,最后得到一个groovy脚本。这个片段解析一个pom并给你一个罐子列表。非常适合XML解析!

#!/usr/bin/env groovy
def pom = new XmlSlurper().parse('pom.xml')
def repo = "${System.env.HOME}/.m2/repository"

pom.dependencies.dependency.each { dep ->
    def jarName = "${dep.artifactId}-${dep.version}.jar"
    def groupPath = dep.groupId.text().replaceAll('\\.', '/')
    def jarPath = "${repo}/${groupPath}/${dep.artifactId}/${dep.version}"
    println "$jarPath/$jarName"
}

答案 3 :(得分:4)

  

例如,如果我想做一些http脚本,我不会只是使用java语法来调用Commons HttpClient吗?

你会“回到使用Commons HttpClient”,但你会使用Groovy语法而不是Java语法来调用它。 Groovy语法很多比Java语法更紧凑,因此更适合脚本编写。换句话说,在Java中使用Java库比在Java中使用Java库需要的代码少得多。

  

似乎没有任何动机可以开发基于groovy的库,因为已经有那么多优秀的Java出现了

Groovy库作者不是开发一个全新的库,而是经常为现有的Java库提供“Groovier”API。示例包括Grails提供的Hibernate构建器和HTTP Builder(委托给Commons HttpClient)。

这些Groovy API提供了直接使用Java API的更紧凑和惯用的替代方法。

答案 4 :(得分:4)

Groovy“开箱即用”用groovier版本或语言结构替换了大量公共类,包括XML,HTTP请求,访问SQL数据库和正则表达式的类。对于大多数脚本任务,您根本不必使用Java库(尽管您仍然可以使用该选项)。但是如果你的脚本使用裸Java库,那么使用Groovy比直接Java要远得多。 Groovy闪耀的地方是“胶水”代码,例如 设置数据结构和文件I / O.

地图和列表允许您创建Java兼容列表和地图;与Java类一起使用的常规Java对象。 Groovy经常将具有变量声明和初始化的多行Java方法调用转换为单行。

考虑这个简短的片段将整个文件加载到String中:

def fileContents = new File(filename).text

String fileContents = "";
try {
    BufferedReader reader = new BufferedReader(new FileInputStream(filename));
    String line = null;
    while ((line = reader.readLine()) != null) {
        text = text + line + "\n";
    }
} catch (IOException e) {
    e.printStackTrace();
}

异常处理通常不是脚本中的重要考虑因素,可以方便地忽略它。

Groovy作为脚本语言的主要优势是可以直接方便地访问庞大的Java代码库。如果这不是您的需要,groovy仍然提供与其他语言(如perl,python或ruby)一样丰富的脚本环境。

答案 5 :(得分:2)

Groovy晃动,一旦你掌握了非常严密的语法,你就会开始使用它来完成很多你刚刚做过的“缓慢的方式”。

有一天,我正在进行讨论,不知道我们在一个系统中的GUID中有多少个字符。而不是仅仅计算数字,这样做更容易:

def str = '92228498-6A2F-DBA2-7A2C-F54B9E607E3A'
int num = 0
str.each {
    num++
}
println num

在本地或共享脚本目录中发现它将来会存在。