11

我更喜欢将脚本语言用于短任务,例如非常简单的 http bot、向/从某处批量导入/导出数据等……基本的一次性脚本和简单的东西。关键是,脚本语言只是编写快速程序的有效工具。至于我目前对 Groovy 的理解......

如果您要在 Groovy 中编程,并且不想编写快速脚本,那么您是否会被迫回到常规的 java 语法(我们知道与脚本语言相比它是如何令人费解的)以便做更复杂的事情吗?例如,如果我想做一些 http 脚本,我不就直接回到使用 java 语法来调用 Commons HttpClient 了吗?对我来说,脚本语言的重点是快速键入和较少强制的构造。还有一件事,当已经有这么多优秀的 Java 库时,似乎没有任何动力去开发基于 groovy 的库,因此使 groovy 看起来是一种具有少量脚本功能的 Java 依赖语言。

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

4

6 回答 6

13

@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 知识,因此是一种非常实用的方法。

于 2010-04-15T17:33:55.873 回答
5

Groovy 的目标之一是与 Java 具有透明的互操作性。Groovy 设计为“一种具有脚本功能的 Java 依赖语言”。但是,我不认为这些特性是次要的——Groovy 有许多静态编程语言(如 Java)所没有的特性。

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

于 2010-04-15T13:53:39.340 回答
5

Groovy 可以非常方便地编写脚本。最近我需要一个脚本来获取 Maven 依赖项到一个lib目录中,并最终得到了一个 groovy 脚本。这个片段解析一个 pom 并给你一个 jar 列表。非常适合 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"
}
于 2010-04-15T21:07:19.857 回答
4

例如,如果我想做一些 http 脚本,我不就直接回到使用 java 语法来调用 Commons HttpClient 了吗?

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

当已经有这么多好的 Java 库出现时,似乎没有任何动力去开发基于 groovy 的库

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

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

于 2010-04-15T15:43:00.147 回答
4

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

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

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

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​​ 等其他语言一样丰富的脚本环境。

于 2010-04-15T17:35:56.097 回答
2

Groovy 摇滚,一旦您掌握了非常紧凑的语法,您就会开始将它用于很多您刚刚完成的“缓慢方式”的事情。

前几天我在一个讨论中,不知何故想知道我们的一个系统的 GUID 中有多少个字符。与其只计算数字,不如这样做更容易:

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

在本地或共享脚本目录中敲击它,它会在未来存在。

于 2011-06-21T07:18:45.637 回答