有没有办法在 Groovy 中的导入周围放置一个 try/catch 块?

Is there a way to place a try/catch block around an import in Groovy?

我目前正在尝试编写一段 Groovy 代码,我想在一台机器上和另一台机器上以不同的方式运行。有些库在另一台机器上不可用,所以我的想法是我会像这样做一个 try/catch 块:

import org.codehaus.groovy.control.MultipleCompilationErrorsException

def importStuff() {
    try {import static java.lang.String.format}
} catch (MultipleCompilationErrorsException) {
    println("import failed.")
}

importStuff()

但是,这会失败并显示以下内容:4: Unexpected input: 'import' @ line 4, column 10. 在 Python 中,语法如下:

try:
    import moduledoesntexist
except:
    print("module does not exist.")

如果 运行,将给出输出:

>>> module does not exist.

是否有办法在 Groovy 中重现此类行为?

Is there a way to place a try/catch block around an import in Groovy?

没有

您可以使用名为 Grape 的内置依赖管理系统在 Groovy 脚本中管理您的依赖(因此支持任何导入)。这样您就可以创建一个 Groovy 脚本,运行 无处不在。考虑以下示例:

@Grab('io.ratpack:ratpack-groovy:1.9.0')
@Grab('org.slf4j:slf4j-simple:1.7.30')

import static ratpack.groovy.Groovy.ratpack

ratpack {
    handlers {
        get {
            render 'Hello World from Ratpack with Groovy!!'
        }
    }
}

这是一个 Groovy 脚本,只需几行代码即可在端口 5050 上启动 Ratpack HTTP 服务器。

$ groovy -version
Groovy Version: 2.5.4 JVM: 1.8.0_292 Vendor: Amazon.com Inc. OS: Linux

$ groovy ratpackscript.groovy
[main] INFO ratpack.server.RatpackServer - Starting server...
[main] INFO ratpack.server.RatpackServer - Building registry...
[main] INFO ratpack.server.RatpackServer - Ratpack started (development) for http://localhost:5050

两个依赖项(ratpack-groovyslf4j-simple)及其传递依赖项在您第一次 运行 脚本时下载(请记住,下载所有必需的文件可能需要一些时间JAR 文件。)

解决下载依赖问题

有时您可能 运行 在下载依赖项时遇到一些问题,但这主要是因为本地存储库中的文件损坏。 Grape 检查您的本地 ~/.m2/repository~/.groovy/grapes 文件夹,如果这些目录中的任何一个依赖项被破坏,您将看到一些无法下载的依赖项名称错误。在两个位置删除该依赖项的文件夹可以解决该问题。 (您不必删除具有依赖项名称的文件夹,而是删除该文件夹内具有该依赖项特定版本的文件夹。)