कुछ जांच के बाद मैं इस निष्कर्ष पर पहुंचा हूं कि निम्नलिखित दृष्टिकोण सबसे अच्छा लगता है।
कुछ / सबपैकेज / 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
कक्षा के भीतर एक विधि के लिए तर्क पारित करना ।
अतिरिक्त टिप्पणियाँ / सुझाव:
- हमेशा अपने ग्रूवी स्क्रिप्ट के भीतर पुन: प्रयोज्य कार्यक्षमता के लिए ग्रूवी स्क्रिप्ट के बजाय एक ग्रूवी क्लास का उपयोग करें। उपरोक्त उदाहरण Util.groovy फ़ाइल में परिभाषित Util वर्ग का उपयोग करता है। पुन: प्रयोज्य कार्यक्षमता के लिए ग्रूवी लिपियों का उपयोग करना समस्याग्रस्त है। उदाहरण के लिए, यदि एक ग्रूवी लिपि का उपयोग किया जाता है, तो लिटील वर्ग को स्क्रिप्ट के निचले भाग में तत्काल
new Util()
भेजना होगा, लेकिन सबसे महत्वपूर्ण बात यह है कि इसे Util.groovy नाम की किसी भी फ़ाइल में रखा जाएगा। ग्रूवी स्क्रिप्ट और ग्रूवी कक्षाओं के बीच अंतर के बारे में अधिक जानकारी के लिए लिपियों बनाम कक्षाओं का संदर्भ लें ।
- उपरोक्त उदाहरण में मैं
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
इसके बजाय पथ का उपयोग करता हूं "some/subpackage/Util.groovy"
। यह गारंटी देगा कि Util.groovy
फ़ाइल हमेशा ग्रूवी स्क्रिप्ट के स्थान ( example.groovy
) के संबंध में मिलेगी न कि वर्तमान कार्यशील निर्देशिका के लिए। उदाहरण के लिए, उपयोग "some/subpackage/Util.groovy"
करने के परिणामस्वरूप खोजा जाएगा WORK_DIR/some/subpackage/Util.groovy
।
- अपनी ग्रूवी लिपियों के नाम के लिए जावा वर्ग के नामकरण सम्मेलन का पालन करें। मैं व्यक्तिगत रूप से एक छोटे से विचलन को पसंद करता हूं जहां स्क्रिप्ट एक पूंजी के बजाय एक कम पत्र के साथ शुरू होती हैं। उदाहरण के लिए,
myScript.groovy
एक स्क्रिप्ट नाम है, और MyClass.groovy
एक वर्ग नाम है। नामकरण my-script.groovy
में कुछ परिदृश्यों में रनटाइम त्रुटियों का परिणाम होगा क्योंकि परिणामी वर्ग में एक वैध जावा वर्ग नाम नहीं होगा।
- सामान्य रूप से JVM की दुनिया में प्रासंगिक कार्यक्षमता का नाम JSR 223: जावा के लिए स्क्रिप्टिंग है । विशेष रूप से ग्रूवी में कार्यक्षमता का नाम ग्रूवी एकीकरण तंत्र है । वास्तव में, इसी दृष्टिकोण का उपयोग ग्रूवी या जावा के भीतर से किसी भी जेवीएम भाषा को कॉल करने के लिए किया जा सकता है । ऐसी जेवीएम भाषाओं के कुछ उल्लेखनीय उदाहरण ग्रूवी, जावा, स्काला, जेरी, और जावास्क्रिप्ट (राइनो) हैं।