经过一番调查,我得出结论,以下方法似乎是最好的。
some/subpackage/Util.groovy
@GrabResolver(name = 'nexus', root = 'https://local-nexus-server:8443/repository/maven-public', m2Compatible = true)
@Grab('com.google.errorprone:error_prone_annotations:2.1.3')
@Grab('com.google.guava:guava:23.0')
@GrabExclude('com.google.errorprone:error_prone_annotations')
import com.google.common.base.Strings
class Util {
void msg(int a, String b, Map c) {
println 'Message printed by msg method inside Util.groovy'
println "Print 5 asterisks using the Guava dependency ${Strings.repeat("*", 5)}"
println "Arguments are a=$a, b=$b, c=$c"
}
}
example.groovy
#!/usr/bin/env groovy
Class clazz = new GroovyClassLoader().parseClass("${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy" as File)
GroovyObject u = clazz.newInstance()
u.msg(1, 'b', [a: 'b', c: 'd'])
要运行example.groovy 脚本,请将其添加到您的系统路径并从任何目录键入:
example.groovy
脚本打印:
Message printed by msg method inside Util.groovy
Print 5 asterisks using the Guava dependency *****
Arguments are a=1, b=b, c=[a:b, c:d]
上面的例子是在以下环境中测试的:Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
该示例演示了以下内容:
- 如何在 groovy 脚本中使用
Util 类。
- 一个
Util 类调用Guava 第三方库,将其包含为Grape 依赖项(@Grab('com.google.guava:guava:23.0'))。
-
Util 类可以驻留在子目录中。
- 将参数传递给
Util 类中的方法。
其他 cmets/建议:
- 始终使用 groovy 类而不是 groovy 脚本来实现 groovy 脚本中的可重用功能。上面的示例使用 Util.groovy 文件中定义的 Util 类。使用 groovy 脚本来实现可重用功能是有问题的。例如,如果使用 groovy 脚本,则 Util 类必须在脚本底部使用
new Util() 进行实例化,但最重要的是,它必须放在一个名为 Util.groovy 的文件中。有关 groovy 脚本和 groovy 类之间差异的更多详细信息,请参阅Scripts versus classes。
- 在上面的示例中,我使用路径
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy" 而不是"some/subpackage/Util.groovy"。这将保证始终可以找到与 groovy 脚本的位置 (example.groovy) 相关的 Util.groovy 文件,而不是当前工作目录。例如,使用"some/subpackage/Util.groovy" 将导致搜索WORK_DIR/some/subpackage/Util.groovy。
- 遵循 Java 类命名约定来命名您的 groovy 脚本。我个人更喜欢脚本以小写字母而不是大写字母开头的小偏差。例如,
myScript.groovy 是脚本名,MyClass.groovy 是类名。命名 my-script.groovy 在某些情况下会导致运行时错误,因为生成的类将没有有效的 Java 类名。
- 在 JVM 世界中,相关功能通常被命名为 JSR 223: Scripting for the Java。特别是在 groovy 中,该功能被命名为 Groovy integration mechanisms。事实上,可以使用相同的方法从 Groovy 或 Java 中调用任何JVM language。此类 JVM 语言的一些著名示例包括 Groovy、Java、Scala、JRuby 和 JavaScript (Rhino)。