Después de algunas investigaciones, he llegado a la conclusión de que el siguiente enfoque parece el mejor.
algunos / 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"
}
}
ejemplo.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'])
Para ejecutar el example.groovy
script, agréguelo a la ruta de su sistema y escriba desde cualquier directorio:
example.groovy
El guión imprime:
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]
El ejemplo anterior se probó en el siguiente entorno: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
El ejemplo demuestra lo siguiente:
- Cómo usar una
Util
clase dentro de un guión maravilloso.
- Una
Util
clase que llama a la Guava
biblioteca de terceros incluyéndola como una Grape
dependencia ( @Grab('com.google.guava:guava:23.0')
).
- La
Util
clase puede residir en un subdirectorio.
- Pasar argumentos a un método dentro de la
Util
clase.
Comentarios / sugerencias adicionales:
- Utilice siempre una clase maravillosa en lugar de una secuencia de comandos maravillosa para la funcionalidad reutilizable dentro de sus secuencias de comandos maravillosas. El ejemplo anterior usa la clase Util definida en el archivo Util.groovy. El uso de scripts maravillosos para una funcionalidad reutilizable es problemático. Por ejemplo, si usa un script maravilloso, entonces la clase Util tendría que ser instanciada en la parte inferior del script con
new Util()
, pero lo más importante, tendría que colocarse en un archivo llamado cualquier cosa menos Util.groovy. Consulte Scripts versus clases para obtener más detalles sobre las diferencias entre los scripts maravillosos y las clases maravillosas.
- En el ejemplo anterior utilizo la ruta en
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
lugar de "some/subpackage/Util.groovy"
. Esto garantizará que el Util.groovy
archivo siempre se encontrará en relación con la ubicación del script maravilloso ( example.groovy
) y no con el directorio de trabajo actual. Por ejemplo, usar "some/subpackage/Util.groovy"
daría como resultado una búsqueda en WORK_DIR/some/subpackage/Util.groovy
.
- Siga la convención de nomenclatura de clases de Java para nombrar sus maravillosos scripts. Personalmente, prefiero una pequeña desviación donde los guiones comienzan con una letra minúscula en lugar de mayúscula. Por ejemplo,
myScript.groovy
es un nombre de script y MyClass.groovy
es un nombre de clase. La asignación de nombres my-script.groovy
dará lugar a errores de tiempo de ejecución en determinados escenarios porque la clase resultante no tendrá un nombre de clase Java válido.
- En el mundo de JVM en general, la funcionalidad relevante se llama JSR 223: Scripting para Java . En groovy en particular, la funcionalidad se denomina mecanismos de integración Groovy . De hecho, se puede utilizar el mismo enfoque para llamar a cualquier lenguaje JVM desde Groovy o Java. Algunos ejemplos notables de estos lenguajes JVM son Groovy, Java, Scala, JRuby y JavaScript (Rhino).