Após alguma investigação, cheguei à conclusão de que a abordagem a seguir parece a melhor.
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"
}
}
exemplo.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 executar o example.groovy
script, adicione-o ao caminho do sistema e digite em qualquer diretório:
example.groovy
O script 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]
O exemplo acima foi testado no seguinte ambiente: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
O exemplo demonstra o seguinte:
- Como usar uma
Util
classe dentro de um script bacana.
- Uma
Util
classe que chama a Guava
biblioteca de terceiros incluindo-a como uma Grape
dependência ( @Grab('com.google.guava:guava:23.0')
).
- A
Util
classe pode residir em um subdiretório.
- Passando argumentos para um método dentro da
Util
classe.
Comentários / sugestões adicionais:
- Sempre use uma classe bacana em vez de um script bacana para funcionalidade reutilizável em seus scripts bacanas. O exemplo acima usa a classe Util definida no arquivo Util.groovy. Usar scripts bacanas para funcionalidade reutilizável é problemático. Por exemplo, se estiver usando um script bacana, a classe Util teria que ser instanciada na parte inferior do script com
new Util()
, mas o mais importante, ela teria que ser colocada em um arquivo denominado qualquer coisa menos Util.groovy. Consulte Scripts versus classes para obter mais detalhes sobre as diferenças entre scripts e classes excelentes.
- No exemplo acima, uso o caminho em
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
vez de "some/subpackage/Util.groovy"
. Isso garantirá que o Util.groovy
arquivo sempre será encontrado em relação à localização do script groovy ( example.groovy
) e não ao diretório de trabalho atual. Por exemplo, usar "some/subpackage/Util.groovy"
resultaria na pesquisa em WORK_DIR/some/subpackage/Util.groovy
.
- Siga a convenção de nomenclatura de classe Java para nomear seus scripts groovy. Eu pessoalmente prefiro um pequeno desvio em que os scripts começam com uma letra minúscula em vez de maiúscula. Por exemplo,
myScript.groovy
é um nome de script e MyClass.groovy
é um nome de classe. A nomenclatura my-script.groovy
resultará em erros de tempo de execução em certos cenários porque a classe resultante não terá um nome de classe Java válido.
- No mundo JVM em geral, a funcionalidade relevante é chamada JSR 223: Scripting for the Java . No groovy em particular, a funcionalidade é chamada de mecanismos de integração do Groovy . Na verdade, a mesma abordagem pode ser usada para chamar qualquer linguagem JVM de Groovy ou Java. Alguns exemplos notáveis de tais linguagens JVM são Groovy, Java, Scala, JRuby e JavaScript (Rhino).