หลังจากการตรวจสอบบางส่วนฉันได้ข้อสรุปว่าแนวทางต่อไปนี้ดูเหมือนจะดีที่สุด
บางส่วน / 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.groovy
สคริปต์ให้เพิ่มเข้าไปในเส้นทางระบบของคุณและพิมพ์จากไดเร็กทอรีใดก็ได้:
example.groovy
สคริปต์พิมพ์:
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]
ตัวอย่างข้างต้นได้รับการทดสอบในสภาพแวดล้อมต่อไปนี้: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
ตัวอย่างแสดงสิ่งต่อไปนี้:
- วิธีใช้
Util
คลาสภายในสคริปต์ที่น่าสนใจ
Util
ระดับการเรียกGuava
ห้องสมุดของบุคคลที่สามโดยรวมทั้งเป็นGrape
การพึ่งพา ( @Grab('com.google.guava:guava:23.0')
)
Util
ชั้นสามารถอยู่ในไดเรกทอรีย่อย
- ส่งผ่านอาร์กิวเมนต์ไปยังเมธอดภายใน
Util
คลาส
ความคิดเห็น / ข้อเสนอแนะเพิ่มเติม:
- ใช้คลาส groovy เสมอแทนการใช้ groovy script สำหรับฟังก์ชันที่ใช้ซ้ำได้ภายในสคริปต์ groovy ของคุณ ตัวอย่างข้างต้นใช้คลาส Util ที่กำหนดไว้ในไฟล์ Util.groovy การใช้สคริปต์ groovy สำหรับฟังก์ชันที่ใช้ซ้ำได้นั้นเป็นปัญหา ตัวอย่างเช่นหากใช้สคริปต์ groovy คลาส Util จะต้องถูกสร้างอินสแตนซ์ที่ด้านล่างของสคริปต์ด้วย
new Util()
แต่ที่สำคัญที่สุดคือจะต้องวางไว้ในไฟล์ชื่ออะไรก็ได้ยกเว้น Util.groovy อ้างถึงคลาสสคริปต์กับคลาสสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับความแตกต่างระหว่าง Groovy Scripts และ Groovy Class
- ในตัวอย่างข้างต้นที่ผมใช้เส้นทางแทน
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
"some/subpackage/Util.groovy"
สิ่งนี้จะรับประกันได้ว่าUtil.groovy
ไฟล์จะพบเสมอโดยสัมพันธ์กับตำแหน่งของ groovy script ( example.groovy
) ไม่ใช่ไดเร็กทอรีการทำงานปัจจุบัน ตัวอย่างเช่นการใช้จะส่งผลในการค้นหาที่"some/subpackage/Util.groovy"
WORK_DIR/some/subpackage/Util.groovy
- ทำตามหลักการตั้งชื่อคลาส Java เพื่อตั้งชื่อสคริปต์ที่น่าสนใจของคุณ โดยส่วนตัวแล้วฉันชอบการเบี่ยงเบนเล็กน้อยที่สคริปต์ขึ้นต้นด้วยตัวอักษรตัวล่างแทนที่จะเป็นตัวพิมพ์ใหญ่ ตัวอย่างเช่น
myScript.groovy
ชื่อสคริปต์และMyClass.groovy
เป็นชื่อคลาส การตั้งชื่อmy-script.groovy
จะส่งผลให้เกิดข้อผิดพลาดรันไทม์ในบางสถานการณ์เนื่องจากคลาสผลลัพธ์จะไม่มีชื่อคลาส Java ที่ถูกต้อง
- ในโลก JVM ทั่วไปฟังก์ชันการทำงานที่เกี่ยวข้องเป็นชื่อJSR 223: สคริปต์สำหรับ Java ใน Groovy โดยเฉพาะอย่างยิ่งการทำงานที่มีชื่อว่ากลไกบูรณาการ Groovy ในความเป็นจริงสามารถใช้วิธีการเดียวกันเพื่อเรียกภาษา JVMใด ๆจากภายใน Groovy หรือ Java ตัวอย่างที่โดดเด่นของภาษา JVM ได้แก่ Groovy, Java, Scala, JRuby และ JavaScript (Rhino)