2012-09-24 18 views
6

उत्पन्न किया गया है मैं ग्रहण के साथ एक निष्पादन योग्य जार फ़ाइल बना सकता हूं। मान लें कि इसे ast.jar कहा जाता है, और मुख्य श्रेणी ASTExplorer है। मैं सत्यापित कर सकता हूं कि यह java -jar ast.jar के साथ काम करता है।एक्लिप्स के पीछे जादू निष्पादन योग्य जार फ़ाइल

फिर, मैं जार फ़ाइल को एक अलग निर्देशिका में अनजिप करता हूं और सत्यापित करता हूं कि ASTExplorer astexplorer निर्देशिका में है। लेकिन जब मैंने इस आदेश को java -cp . astexplorer.ASTExplorer निष्पादित किया तो मुझे यह त्रुटि मिल गई।

java -cp . astexplorer/ASTExplorer 
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 

बात यह है कि जार फ़ाइल में कोई संगठन/ग्रहण/swt निर्देशिका नहीं है।

Directory screenshot

निष्पादन योग्य जार फ़ाइल के पीछे जादू क्या है? अनजिप होने पर यह क्यों नहीं चलता है?

+0

आपको ग्रहण काले जादू के बिना, अपने जार को चींटी के साथ बनाने का प्रयास करना चाहिए। –

+0

जब आप 'java -jar ast.jar' चलाते हैं तो आपका क्लासपाथ क्या होता है। जब आप जार फ़ाइल को अनपैक करते हैं तो आपका क्लासपाथ '.' है। मैं अनुमान लगा रहा हूं कि एक पर्यावरण परिवर्तनीय क्लासस्पैट कुछ ऐसा सेट है जो 'जावा -jar ast.jar' को काम करने की अनुमति देता है। – km1

उत्तर

2

जब ग्रहण एक रनने योग्य जार पैकेज करता है, इसमें निर्भरताएं नेस्टेड जार फ़ाइलों के रूप में शामिल होती हैं, और इसमें एक विशेष क्लासलोडर भी शामिल होता है जो समझता है कि नेस्टेड जार में कक्षाएं कैसे प्राप्त करें। यह केवल नेस्टेड जार के साथ काम करता है और जब आप इसे सबकुछ निकालते हैं तो आप इसे काम करने से रोकते हैं।

मैं एक एक्लिप्स उत्पादित runnable जार में देखा है, और यहाँ मैं क्या लगता है कि तुम क्या करने की जरूरत करेंगे:

  1. एक निर्देशिका के लिए सब कुछ निकालें। निर्भरता जार शीर्ष स्तर की निर्देशिका
  2. हटाएँ org/ग्रहण/जेडीटी/आंतरिक निर्देशिका
  3. java -cp .;dep-jar;dep-jar;... your.main.class

साथ शीर्ष स्तर की निर्देशिका से अपने मुख्य वर्ग चलाने पर निकाले जाते हैं

मैंने इसे एक चलने योग्य जार के साथ करने की कोशिश की जो मैं झूठ बोल रहा था और यह काम करता है। चरण 2 कड़ाई से जरूरी नहीं है।

+0

मैं इसे -cp का उपयोग करके निष्पादित कर सकता हूं: ECLIPSE main.class से सभी जार फाइलें। मुझे लगता है कि ग्रहण करने के अलावा ग्रहण निष्पादन योग्य जार फ़ाइल के पीछे कोई बड़ा जादू नहीं लगता है और जार फ़ाइलों को स्वचालित रूप से संदर्भित करता है – prosseek

+1

प्लस मेनफैस्ट फ़ाइल में "jarinjar" क्लासलोडर को प्रतिस्थापित करता है। –

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