Po pewnym dochodzeniu doszedłem do wniosku, że następujące podejście wydaje się najlepsze.
jakiś / 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'])
Aby uruchomić example.groovy
skrypt, dodaj go do ścieżki systemowej i wpisz z dowolnego katalogu:
example.groovy
Skrypt drukuje:
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]
Powyższy przykład został przetestowany w następującym środowisku: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
Przykład pokazuje, co następuje:
- Jak korzystać z
Util
klasy w świetnym skrypcie.
Util
Klasa wywołanie Guava
biblioteki strony trzeciej, włączając go jako Grape
zależność ( @Grab('com.google.guava:guava:23.0')
).
Util
Klasy mogą znajdować się w podkatalogu.
- Przekazywanie argumentów do metody w
Util
klasie.
Dodatkowe uwagi / sugestie:
- Zawsze używaj groovy class zamiast groovy script do wielokrotnego użytku w swoich groovy scripts. W powyższym przykładzie użyto klasy Util zdefiniowanej w pliku Util.groovy. Używanie groovy skryptów do wielokrotnego użytku jest problematyczne. Na przykład, jeśli używasz groovy script, to klasa Util musiałaby zostać utworzona na dole skryptu z
new Util()
, ale co najważniejsze, musiałaby zostać umieszczona w pliku o nazwie cokolwiek innego niż Util.groovy. Zobacz Skrypty a klasy , aby uzyskać więcej informacji na temat różnic między porywające skryptów i klas porywające.
- W powyższym przykładzie używam ścieżki
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
zamiast "some/subpackage/Util.groovy"
. Gwarantuje to, że Util.groovy
plik będzie zawsze znajdowany w odniesieniu do lokalizacji skryptu groovy ( example.groovy
), a nie do bieżącego katalogu roboczego. Na przykład użycie "some/subpackage/Util.groovy"
spowoduje wyszukanie w WORK_DIR/some/subpackage/Util.groovy
.
- Postępuj zgodnie z konwencją nazewnictwa klas Java, aby nazywać swoje świetne skrypty. Osobiście wolę małe odchylenie, w którym skrypty zaczynają się od małej litery zamiast dużej. Na przykład
myScript.groovy
to nazwa skryptu, a MyClass.groovy
to nazwa klasy. Nazewnictwo my-script.groovy
spowoduje błędy w czasie wykonywania w niektórych scenariuszach, ponieważ wynikowa klasa nie będzie miała prawidłowej nazwy klasy Java.
- W świecie JVM ogólnie odpowiednia funkcjonalność nosi nazwę JSR 223: Scripting for the Java . Szczególnie groovy funkcjonalność nazywa się mechanizmami integracji Groovy . W rzeczywistości to samo podejście można zastosować w celu wywołania dowolnego języka JVM z poziomu Groovy lub Java. Niektóre godne uwagi przykłady takich języków JVM to Groovy, Java, Scala, JRuby i JavaScript (Rhino).