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.groovyscript, 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
Utilclase dentro de un guión maravilloso.
- Una
Utilclase que llama a la Guavabiblioteca de terceros incluyéndola como una Grapedependencia ( @Grab('com.google.guava:guava:23.0')).
- La
Utilclase puede residir en un subdirectorio.
- Pasar argumentos a un método dentro de la
Utilclase.
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.groovyarchivo 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.groovyes un nombre de script y MyClass.groovyes un nombre de clase. La asignación de nombres my-script.groovydará 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).