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.groovyskrip, 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
Utilkelas di dalam skrip yang menarik.
- Sebuah
Utilkelas memanggil Guavalibrary pihak ketiga dengan memasukkan sebagai Grapeketergantungan ( @Grab('com.google.guava:guava:23.0')).
- The
Utilkelas dapat berada di subdirektori.
- Meneruskan argumen ke metode di dalam
Utilkelas.
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.groovyfile 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.groovyadalah nama skrip, dan MyClass.groovymerupakan nama kelas. Penamaan my-script.groovyakan 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).