Biraz araştırdıktan sonra, aşağıdaki yaklaşımın en iyisi olduğu sonucuna vardım.
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.groovyKomut dosyasını çalıştırmak için sistem yolunuza ekleyin ve herhangi bir dizinden yazın:
example.groovy
Komut dosyası şunu yazdırır:
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]
Yukarıdaki örnek aşağıdaki ortamda test edildi: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
Örnek şunları göstermektedir:
UtilHarika bir betik içinde bir sınıf nasıl kullanılır .
- Üçüncü taraf kitaplığını bağımlılık ( ) olarak
Utilekleyerek çağıran bir sınıf .GuavaGrape@Grab('com.google.guava:guava:23.0')
UtilSınıf alt dizinde kalabilir.
UtilSınıf içindeki bir yönteme bağımsız değişkenler iletme .
Ek yorumlar / öneriler:
- Harika komut dosyalarınızda yeniden kullanılabilir işlevsellik için her zaman harika bir komut dosyası yerine harika bir sınıf kullanın. Yukarıdaki örnek, Util.groovy dosyasında tanımlanan Util sınıfını kullanır. Yeniden kullanılabilir işlevsellik için harika komut dosyaları kullanmak sorunludur. Örneğin, harika bir komut dosyası kullanılıyorsa, Util sınıfının komut dosyasının altında somutlaştırılması gerekir
new Util(), ancak en önemlisi Util.groovy dışında herhangi bir adda bir dosyaya yerleştirilmesi gerekir. Harika komut dosyaları ve harika sınıflar arasındaki farklar hakkında daha fazla ayrıntı için Komut Dosyalarına karşı sınıflara bakın .
- Yukarıdaki örnekte
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"yerine yolu kullanıyorum "some/subpackage/Util.groovy". Bu, Util.groovydosyanın her zaman harika betiğin bulunduğu yere ( example.groovy) göre bulunacağını ve mevcut çalışma dizini ile ilişkili olmayacağını garanti eder . Örneğin, kullanmak "some/subpackage/Util.groovy", arama ile sonuçlanır WORK_DIR/some/subpackage/Util.groovy.
- Harika komut dosyalarınızı adlandırmak için Java sınıfı adlandırma kuralını izleyin. Şahsen, senaryoların büyük harf yerine küçük harfle başladığı küçük bir sapmayı tercih ederim. Örneğin
myScript.groovy, bir komut dosyası adıdır ve MyClass.groovybir sınıf adıdır. Adlandırma my-script.groovy, belirli senaryolarda çalışma zamanı hatalarına neden olur çünkü ortaya çıkan sınıf geçerli bir Java sınıf adına sahip olmayacaktır.
- Genel olarak JVM dünyasında ilgili işlevsellik JSR 223: Java için Komut Dosyası olarak adlandırılır . Groovy'de özellikle işlevsellik Groovy entegrasyon mekanizmaları olarak adlandırılır . Aslında, Groovy veya Java'dan herhangi bir JVM dilini çağırmak için aynı yaklaşım kullanılabilir . Bu tür JVM dillerinin bazı dikkate değer örnekleri Groovy, Java, Scala, JRuby ve JavaScript'tir (Rhino).