2011-05-28 15 views
8

के बावजूद जावा NoClassDefFoundError मुझे कंसोल और/या एंटी के साथ जावा एप्लिकेशन चलाने के लिए कुछ परेशानी है। मुझे पता है कि बहुत से शुरुआती मुद्दे क्लासपाथ से सेट या गलत तरीके से सेट नहीं किए जा रहे हैं, हालांकि मुझे पूरा यकीन है कि मैंने इसे सही तरीके से सेट किया है, इसलिए मेरी खोज ने केवल उस पर परिणाम प्राप्त किए।सेट क्लासपाथ

यहां मेरे आवेदन का सामान्य सेटअप है: कक्षाएं संकुल मॉडल, दृश्य और नियंत्रक में हैं। नियंत्रक। नियंत्रक मुख्य विधि के साथ कक्षा है। मैं ऑब्जेक्ट डीबी का उपयोग अपने जेपीए प्रदाता के रूप में कर रहा हूं।

मैं अपने आवेदन को संकलित करने के लिए चींटी का उपयोग कर रहा हूं।

संकलन के बाद, मैं निम्नलिखित स्क्रिप्ट के साथ चींटी से अपने आवेदन चला सकते हैं:

<target name="run" description="default build process"> 
    <java fork="true" classname="${main-class}"> 
     <classpath> 
      <path refid="classpath" /> 
     </classpath> 
    </java> 
</target> 

जहां $ {मुख्य स्तरीय} controller.Controller है और classpath (/ lib और/जिले फ़ोल्डरों के होते हैं आवेदन के जार फ़ाइल/जिले)

अब मैं/lib और/जिले से एक अलग फ़ोल्डर में सभी .jar फाइलों को कॉपी करने और उन्हें चलाने की कोशिश की java -jar cooking.jar -cp . जो

Exception in thread "main" java.lang.NoClassDefFoundError: javax/persistence/Persistence 
    at model.jpa.JPAModelFactory.<init>(JPAModelFactory.java:28) 
    at model.jpa.JPAModelFactory.<init>(JPAModelFactory.java:24) 
    at controller.Controller.<init>(Controller.java:59) 
    at controller.Controller.main(Controller.java:116) 
Caused by: java.lang.ClassNotFoundException: javax.persistence.Persistence 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 4 more 
में जो परिणाम के साथ करने के लिए संकलित किया गया है

<target name="run2" description="default build process"> 
    <java fork="true" jar="${dist.dir}/${ant.project.name}.jar"> 
     <classpath> 
      <path refid="classpath" /> 
     </classpath> 
    </java> 
</target> 

जो एक ही त्रुटि में परिणाम: 63,210

तो मैं चींटी और थोड़ा करने के लिए निर्माण लक्ष्य से ऊपर संशोधित करने की कोशिश की। मुझे समझ में नहीं आता क्यों।

बस मुख्य वर्ग सीधे निर्दिष्ट करने के द्वारा यह परीक्षण करने के लिए, मैं कमांड लाइन से चल रहा है की कोशिश की: java -cp . controller.Controller जो किसी कारण भी वर्ग नहीं ढूंढ सकते हैं (यह वहाँ है, मैं इस बात की पुष्टि):

Exception in thread "main" java.lang.NoClassDefFoundError: controller/Controller 
Caused by: java.lang.ClassNotFoundException: controller.Controller 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
Could not find the main class: controller.Controller. Program will exit. 

मैं JAVA_HOME को मेरे जेडीके के पथ पर सेट किया है, और क्लासस्पैट मेरे जेआरई/lib पथ पर है। क) क्यों जावा controller.Controller पता लगाने में असमर्थ है, भले ही यह .jar फ़ाइल में मौजूद है: ओएस विंडोज 7 64 बिट है, जावा संस्करण 1.6.0_25-B06

मैं दो बातें हैरान कर रहा हूँ और .jar फ़ाइल वर्तमान निर्देशिका में है? बी) मैं गलत क्या कर रहा हूं कि जावा के साथ जावा को कॉल करना लुकअप तंत्र को गड़बड़ कर रहा है।

किसी भी मदद की अत्यधिक सराहना की जाती है।

+0

कक्षा-पथ और मुख्य श्रेणी प्रविष्टि के लिए आप अपनी Manifest.MF फ़ाइल में क्या देखते हैं? – CoolBeans

+0

प्रकट-संस्करण: 1.0 चींटी-संस्करण: अपाचे चींटी 1.7.1 निर्मित-द्वारा: 20.0-B11 (सन माइक्रोसिस्टम्स इंक) मुख्य-क्लास: controller.Controller – Tobias

उत्तर

1

हालांकि मैं काफी यकीन है कि मैं इसे सही ढंग से

सबूत आप के खिलाफ है सेट कर रहा हूँ। JVM आपको बता रहा है कि आपने इसे सही तरीके से सेट नहीं किया है।

आपको क्या लगता है कि रेफ 'क्लासपाथ' इंगित करता है? आप कहां मानते हैं कि इसके मूल्य आ रहे हैं? उन्हें चींटी build.xml के अंदर परिभाषित किया जाना चाहिए, है ना? इस तरह:

<path id="production.class.path"> 
    <pathelement location="${production.classes}"/> 
    <pathelement location="${production.resources}"/> 
    <fileset dir="${production.lib}"> 
     <include name="**/*.jar"/> 
     <exclude name="**/junit*.jar"/> 
     <exclude name="**/*test*.jar"/> 
    </fileset> 
</path> 

<path id="test.class.path">        
    <path refid="production.class.path"/> 
    <pathelement location="${test.classes}"/> 
    <pathelement location="${test.resources}"/> 
    <fileset dir="${test.lib}"> 
     <include name="**/junit*.jar"/> 
     <include name="**/*test*.jar"/> 
    </fileset> 
</path> 

आप एक निष्पादन योग्य जार बना रहे हैं, तो आप प्रकट में मुख्य वर्ग और classpath निर्दिष्ट करने की आवश्यकता, के रूप में CoolBeans सही ढंग से टिप्पणी में बताया। तीसरे पक्ष के जार स्थानों को निष्पादन योग्य जेएआर के सापेक्ष होना चाहिए। आपको उन्हें अपने निष्पादन योग्य जेएआर के साथ इस तरह से पैकेज करना चाहिए कि सापेक्ष पथ को हल करना और समझना आसान हो।

+0

प्रतिक्रियाएं अब तक के लिए धन्यवाद। – Tobias

+0

प्रतिक्रियाओं के लिए धन्यवाद। मैंने मैनिफेस्ट में मुख्य वर्ग निर्दिष्ट किया है जैसा कि ऊपर मेरी टिप्पणी में देखा जा सकता है। इसके अलावा, एंटी-फ़ाइल क्लासपाथ में दो फ़ोल्डरों को इंगित किया जाता है ("और क्लासपाथ में/lib और/dist फ़ोल्डर्स होते हैं (एप्लिकेशन की जार फ़ाइल को संकलित/डिस्प्ले किया जाता है)"। मैं अपनी बिल्ड फ़ाइल की परिभाषा यहां पोस्ट करूंगा, लेकिन टिप्पणी अनुभाग अच्छी तरह से चीजों को प्रारूपित नहीं करता है। हालांकि मैनिफेस्ट फ़ाइल में कोई जार-स्थान नहीं हैं। मैंने सोचा कि यह सीसी स्विच क्या है? यदि यह पर्याप्त नहीं है, तो मैं मैनिफेस्ट में स्थानों को कैसे सेट करूं – Tobias

+0

-cp क्लासपाथ निर्दिष्ट करने के लिए कमांड लाइन तरीका है। एंटी का रनटाइम पर आपकी जेएआर फ़ाइल पर कोई प्रभाव नहीं पड़ता है - यह एक बिल्ड टूल है। लगता है जैसे आप बेहतर सीखेंगे कि अपने जेएआर के मैनिफेस्ट में क्लासपाथ कैसे सेट करें: http://download.oracle.com/javase/tutorial/deployment/jar/downman.html – duffymo

2

वर्ग पथ वर्ग फाइलों के साथ

  1. निर्देशिका (उनके उचित पैकेज निर्देशिका में)
  2. जार फ़ाइलों होनी चाहिए।

आप जार की निर्देशिका में कक्षा पथ को इंगित नहीं कर सकते हैं। अनुप्रयोग सर्वर चलाते समय चीजें भिन्न होती हैं (जैसे टोमकैट), जो आपके लिए निर्देशिका से जार लोड करेगी।

0

मैंने पाया यह होता है जब मैं दोनों<classpath> और लक्ष्य में jar="..." निर्दिष्ट करें। मैंने jar="..." को हटा दिया, .jar को <classpath> सूची में रखा और उसके बाद यह चला गया।

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