2013-08-02 17 views
5

मेरी निर्देशिका संरचना इस तरह दिखती है।जेवीएम मेरी कक्षा नहीं ढूंढ सकता: java.lang.NoClassDefFoundError

PackagesUnit3/com/myname/शुरू/PackagesTest.java
(इस वर्ग के अपने मुख्य और आयात बयान "आयात com.systems.mui शामिल *;।)

PackagesUnit3/com/सिस्टम /mui/Test.java
(इस वर्ग पैकेज बयान "पैकेज com.systems.mui," शामिल हैं)

PackageUnit3 साथ

मेरी आधार निर्देशिका के रूप में मैं बयान के साथ सफलतापूर्वक दोनों वर्गों संकलन कर सकते हैं

"javac com/myname/start/PackagesTest.java" 

हालांकि मैं आदेश

"java com.myname.start.PackagesTest" 

Error: "Exception in thread "main" java.lang.NoClassDefFoundError: com/myname/start/PackagesTest (wrong name: PackagesTest)" 

संकलक सफलतापूर्वक जावा कक्षाएं से प्रत्येक के लिए .class फ़ाइलें उत्पन्न होते हैं और उन्हें स्रोत फ़ाइलों के रूप में ही स्थान में रखा के साथ कोड नहीं चल सकता।

होरस्टमान के अनुसार, "कोर जावा" 9वीं संस्करण। पी। 186, मेरा "जावा" कमांड सिंटैक्स काम करना चाहिए।

मुझे वर्तमान निर्देशिका ("।") निर्दिष्ट नहीं करना चाहिए क्योंकि मैं क्लासपाथ (-सीपी) विकल्प का उपयोग नहीं कर रहा हूं।

एक नोट: मैंने "SUBST R:" का उपयोग बेस निर्देशिका के रूप में PackagesUnit3 निर्देशिका को स्थापित करने के लिए किया था। मेरी वास्तविक कमांड लाइन की तरह दिखती है:>

कोई सुझाव ??

+2

+1 क्योंकि आपके प्रश्न शीर्षक ने मुझे हंस दिया। :) –

+2

'जावा com.myname.start.Packages.test' - क्या यह एक टाइपो है? क्योंकि आपका वर्ग का नाम 'पैकेजेजटेस्ट' है। –

+0

मेरा सुझाव है कि आप अपनी कमांड लाइन को ठीक करें। यदि आपके पैकेजेजटेस्ट क्लास में मुख्य() विधि है, तो आपकी कमांड लाइन जावा com.myname.start.PackagesTest होना चाहिए। – Olaf

उत्तर

10

अपवाद को देखते हुए यह लगता है कि आप एक package बयान भूल रहे हैं की तरह:

package com.myname.start; 

आपका पैकेज घोषणा अपने निर्देशिका संरचना से मेल खाना चाहिए, और फिर वर्ग का सही पूरी तरह से योग्य नाम के साथ उत्पन्न हो जाएगा com.myname.start.PackageTest

या तो एक आईडीई में संकलित करें जो आपके लिए चीजों को सॉर्ट करेगा, या रूट आउटपुट निर्देशिका निर्दिष्ट करने के लिए वैकल्पिक -d तर्क के साथ अपने पैकेज संरचना की जड़ से संकलित करेगा।

$ javac -d bin com/myname/start/*.java 
$ java -cp bin com.myname.start.PackageTest 
+0

मैं हमेशा एक आईडीई से काम करता हूं, इसलिए मैं एक विशेषज्ञ नहीं हूं, लेकिन क्लासस्पैट को किसी भी तरह से सेट नहीं किया जाना चाहिए? –

+1

@ एडवर्डफॉक: नहीं - आप हमेशा '-cp' या 'classpath' का उपयोग कर सकते हैं, लेकिन डिफ़ॉल्ट रूप से वर्तमान निर्देशिका का उपयोग करना डिफ़ॉल्ट है। –

+0

जॉन - आप बिल्कुल सही हैं - मैंने पैकेजेजटेस्ट स्रोत फ़ाइल में आपके द्वारा बताए गए पैकेज स्टेटमेंट को नहीं रखा है। यह अब रनटाइम त्रुटि के बिना चलता है। टी.जे. सलाह सही थी। –

0

मैं इस पर देख लिया है, परिदृश्य निर्मित और तुम सही हो ... सभी वर्गों मान लिया जाये कि सार्वजनिक होते हैं, सही पैकेज घोषणाओं के साथ, और रूट निर्देशिका से संकलन, वर्ग Test यह बाद से सफलतापूर्वक संकलित कर देगा किसी अन्य वर्ग (या विभिन्न संकुलों से कक्षाओं) का संदर्भ नहीं देता है। -cp विकल्प आवश्यक है

कक्षा PackagesTest को संकलित करते समय, यह Test कक्षा को खोजने में विफल रहता है। लेकिन -cp . जोड़कर, यह सफलतापूर्वक संकलित करता है।

एक बार दोनों फाइल संकलित हो जाने पर, PackagesTest 'मुख्य चलाने की कोशिश कर रहे हैं, कक्षा Test कक्षा में भी असफल हो जाएंगे। लेकिन -cp , जोड़कर यह आसानी से चलता है।

विकल्प -verbose विकल्प का उपयोग करके आप देख सकते हैं कि javac (और java) कमांड कक्षाओं की तलाश में है, क्योंकि यह डिफ़ॉल्ट क्लासपाथ प्रदर्शित करता है, जिसमें "।" (स्थानीय निर्देशिका)

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