Setelah beberapa penyelidikan saya sampai pada kesimpulan bahwa pendekatan berikut tampaknya yang terbaik.
beberapa / sub-paket / 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'])
Untuk menjalankan example.groovy
skrip, tambahkan ke jalur sistem Anda dan ketik dari direktori mana pun:
example.groovy
Naskah mencetak:
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]
Contoh di atas telah diuji di lingkungan berikut: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
Contoh tersebut menunjukkan hal berikut:
- Cara menggunakan
Util
kelas di dalam skrip yang menarik.
- Sebuah
Util
kelas memanggil Guava
library pihak ketiga dengan memasukkan sebagai Grape
ketergantungan ( @Grab('com.google.guava:guava:23.0')
).
- The
Util
kelas dapat berada di subdirektori.
- Meneruskan argumen ke metode di dalam
Util
kelas.
Komentar / saran tambahan:
- Selalu gunakan kelas yang asyik sebagai ganti skrip asyik untuk fungsionalitas yang dapat digunakan kembali dalam skrip asyik Anda. Contoh di atas menggunakan kelas Util yang ditentukan dalam file Util.groovy. Menggunakan skrip keren untuk fungsionalitas yang dapat digunakan kembali bermasalah. Misalnya, jika menggunakan skrip groovy maka kelas Util harus dibuat di bagian bawah skrip dengan
new Util()
, tetapi yang paling penting itu harus ditempatkan dalam file bernama apa pun kecuali Util.groovy. Lihat Skrip versus kelas untuk detail lebih lanjut tentang perbedaan antara skrip keren dan kelas keren.
- Dalam contoh di atas saya menggunakan path
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
sebagai ganti "some/subpackage/Util.groovy"
. Ini akan menjamin bahwa Util.groovy
file akan selalu ditemukan dalam kaitannya dengan lokasi skrip groovy ( example.groovy
) dan bukan direktori kerja saat ini. Misalnya, menggunakan "some/subpackage/Util.groovy"
akan menghasilkan pencarian di WORK_DIR/some/subpackage/Util.groovy
.
- Ikuti konvensi penamaan kelas Java untuk memberi nama skrip keren Anda. Saya pribadi lebih suka penyimpangan kecil di mana skrip dimulai dengan huruf kecil daripada huruf kapital. Misalnya,
myScript.groovy
adalah nama skrip, dan MyClass.groovy
merupakan nama kelas. Penamaan my-script.groovy
akan mengakibatkan error runtime dalam skenario tertentu karena kelas yang dihasilkan tidak akan memiliki nama kelas Java yang valid.
- Di dunia JVM secara umum, fungsionalitas yang relevan dinamai JSR 223: Scripting untuk Java . Secara khusus, groovy fungsinya dinamai mekanisme integrasi Groovy . Faktanya, pendekatan yang sama dapat digunakan untuk memanggil bahasa JVM apa pun dari dalam Groovy atau Java. Beberapa contoh penting dari bahasa JVM tersebut adalah Groovy, Java, Scala, JRuby, dan JavaScript (Rhino).