2016-01-18 18 views
5

के साथ एक निष्पादन योग्य जार बनाना मेरे पास एक groovy स्क्रिप्ट Automate.groovy है। स्क्रिप्ट में कक्षा परिभाषा या मुख्य विधि नहीं है। मैं स्क्रिप्ट युक्त जार बनाने का सबसे आसान तरीका ढूंढ रहा हूं। मैं निम्न आदेश का उपयोग कर ग्रूवी स्क्रिप्ट संकलन करने की कोशिश की:ग्रोवी स्क्रिप्ट

groovyc Automate.groovy 

मैं भी एक मैनिफ़ेस्ट फ़ाइल प्रकट-addition.txt कि मुख्य वर्ग

Main-Class: Automate 

निर्दिष्ट करता है और मैं जार आदेश का उपयोग कर बनाई गई:

jar cvfm Automate.jar mainfest-addition.txt *.class 

यह मैं Automate.class साथ एक जार दिया और $ 1.class और मुख्य वर्ग के साथ एक मैनिफ़ेस्ट फ़ाइल को स्वचालित। लेकिन जब मैं java -jar Automate.jar का उपयोग कर जार भागने की कोशिश की मैं हमेशा त्रुटि

cannot find or load main class Automate. 

मैं गलत यहाँ क्या कर रहा हूँ मिल सकता है?

जार बनाने के लिए इस तरह का एक आसान तरीका होना चाहिए। मेरे पास यह एक स्क्रिप्ट फ़ाइल है जो मैं अपने जार में चाहता हूं और मैं यह काम करने के लिए मेवेन/चींटी/ग्रेडल का उपयोग नहीं करना चाहता हूं। ऐसा करने के लिए कोई आसान और सीधा तरीका नहीं है?

उत्तर

7

कक्षा फ़ाइल ग्रोवी पर निर्भरता है। एम्बेड करने योग्य जार का उपयोग समस्या को ठीक करेगा।

, ग्रूवी 2.4.5 का उपयोग करता है, तो मैं Automate.groovy

println "Hello from Automate.groovy" 

के लिए इस स्क्रिप्ट है और इस manifest.txt का उपयोग करें:

Main-class: Automate 
Class-path: jar/groovy-all-2.4.5.jar 

और इस सरल निर्माण स्क्रिप्ट:

rm *.class 
groovyc Automate.groovy 
jar cvfm Automate.jar manifest.txt Automate.class 

और, चलाए गए निर्देशिका में, मैं इसे निष्पादित करता हूं:

bash$ mkdir jar 
bash$ cp $GROOVY_HOME/embeddable/groovy-all-2.4.5.jar jar 

तो यह काम करता है:

bash$ java -jar Automate.jar 
Hello from Automate.groovy 

समाधान काफी बेहतर हो सकता है अगर एम्बेड करने योग्य जार Automate.jar में ही शामिल किया गया है। इसका एक उदाहरण, ग्रैडल का उपयोग करके, this project है।

+0

Automate.jar के अंदर groovy-all jar को शामिल करने का यह बेहतर समाधान क्यों है? – RaGe

+0

मैंने वास्तव में जावा-सीपी ग्रोवी-all.jar Automate.jar का उपयोग करके क्लासपाथ में ग्रोवी-ऑल जार समेत कोशिश की। फिर भी मुझे एक ही त्रुटि मिली। मैं वास्तव में एक @Grab एनोटेशन था और यही वास्तव में समस्या का कारण बन रहा था। जब मैंने इसे हटा दिया, तो यह मुख्य वर्ग का पता लगाने में सक्षम था – Harini

-1

वास्तविक समस्या @Grab एनोटेशन थी जो मेरी लिपि में थी। मैंने एक ग्रैडल प्रोजेक्ट बनाया और केवल एक प्रिंटल कथन के साथ HelloWorld.groovy को एक बहुत ही सरल स्क्रिप्ट जोड़ा लेकिन कुछ आयात करने के लिए @Grab का भी उपयोग किया। जब मैंने जार बनाया तो इसे मुख्य वर्ग नहीं मिलेगा। जब मैंने चारों ओर गुगल किया तो मैंने पाया कि @Grab एनोटेशन का उपयोग स्टैंडअलोन स्क्रिप्ट में किया जाना है, न कि पूर्व-संकलित स्क्रिप्ट के लिए। इसलिए यदि आपको अपने संकलित ग्रोवी में @Grab रखना है तो आपको अतिरिक्त आईवी निर्भरता जोड़ने की आवश्यकता है या @Grab नहीं रखना है और निर्भरताओं को शामिल करने के लिए किसी अन्य तरीके का उपयोग करना है। मैंने अपनी स्क्रिप्ट से @Grab हटा दिया और फिर इसे बनाया। जार ने तब ठीक किया।

इस तथ्य से विचलित होने के लिए क्षमा करें कि मैं ग्रैडल/मेवेन का उपयोग नहीं करना चाहता था। मैंने लगभग सभी चीजों को आजमाने में बिताया जो मुझे स्टैक ओवरफ्लो और Google पर मिल सकता था और ग्रैडल की कोशिश कर समाप्त हो गया। मुझे यकीन नहीं है कि यह समस्या का एकमात्र समाधान है, लेकिन यह मेरे लिए काम करता है।

संबंधित मुद्दे