java.lang.UnsupportedClassVersionError: .class फ़ाइल में खराब संस्करण संख्या?


140

मुझे यह त्रुटि तब हो रही है जब मैं एक ओपनसोर्स लाइब्रेरी शामिल करता हूं जिसे मुझे स्रोत से संकलन करना था। अब, वेब पर सभी सुझावों से संकेत मिलता है कि कोड को एक संस्करण में संकलित किया गया था और दूसरे संस्करण में निष्पादित किया गया था (पुराने पर नया)। हालाँकि, मेरे पास अपने सिस्टम पर JRE का केवल एक संस्करण है। अगर मैं कमांड चलाता हूं:

$ javac -version
javac 1.5.0_18

$ java -version
java version "1.5.0_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_18-b02)
Java HotSpot(TM) Server VM (build 1.5.0_18-b02, mixed mode)

और जावा लाइब्रेरी के गुणों के लिए ग्रहण में जाँच करें, मुझे मिलता है 1.5.0_18

इसलिए, मुझे कुछ और निष्कर्ष निकालना होगा, एक वर्ग के लिए आंतरिक, अपवाद फेंक रहा है ?? क्या यह भी संभव है?


2
क्या आपके पास लाइब्रेरी का संकलित संस्करण कहीं और है जो पहले आपके वर्गपथ पर हो सकता है?
जेफ स्टोरी

अच्छा विचार है, लेकिन नहीं। मैंने 'खोज' का उपयोग करके एक जांच की। -नाम '* .जर' | xargs 'JAR के साथ लिबर फोल्डर से' का पता लगाता है। इसके अलावा, मुझे नहीं लगा कि ग्रहण ने CLASSPATH का उपयोग किया है? कोई और अच्छा सुझाव?
grmn.bob

cmd पर इस find -name '* * .jar' कमांड का उपयोग कैसे करें क्योंकि मैं jre src कोड को फिर से बनाना चाहता हूं ... और इसके लिए मुझे इस cmd को आग लगाने की जरूरत है ..... javalobby.org/java/forums /t103334.html.....my jdk C: \ Program Files \ Java \ jdk1.6.0_31 पर है
शिक्षार्थी

जवाबों:


185

मैंने सीखा है कि इस तरह के त्रुटि संदेश आमतौर पर सही होते हैं। जब यह POSSIBLY (आपके मन में) नहीं हो सकता है, तो रिपोर्ट में जो त्रुटि बताई जा रही है, आप किसी अन्य क्षेत्र में समस्या के लिए शिकार करने जाते हैं ... केवल यह पता लगाने के लिए कि मूल त्रुटि संदेश वास्तव में सही था।

चूंकि आप ग्रहण का उपयोग कर रहे हैं, मुझे लगता है कि थिलो के पास यह सही है। आपको यह संदेश मिलने की सबसे अधिक संभावना है क्योंकि आपकी एक परियोजना 1.6 वर्गों को संकलित कर रही है। इससे कोई फर्क नहीं पड़ता कि आपके पास सिस्टम पर केवल 1.5 JRE है, क्योंकि ग्रहण का अपना कंपाइलर (javac नहीं) है, और केवल 1.6 JRE की जरूरत है जो 1.6 क्लासेस संकलित करे। यह अजीब हो सकता है, और इसे स्थापित करने के लिए एक सेटिंग को अनियंत्रित करने की आवश्यकता है, लेकिन मैं इसे करने में कामयाब रहा।

प्रश्न में परियोजना के लिए, परियोजना गुण (आमतौर पर Alt + Enter), जावा कंपाइलर अनुभाग देखें। यहां 1.6 संकलित करने के लिए कॉन्फ़िगर की गई परियोजना की एक छवि है, लेकिन केवल 1.5 JRE के साथ।

यहां छवि विवरण दर्ज करें


पूरी तरह से सहमत ... यही कारण है कि मैंने अपनी टिप्पणी में, पिन-पॉइंट के तरीकों के लिए सवाल पूछा। मुझे ग्रहण की आंतरिक कक्षाओं का पता नहीं था। लाइब्रेरी को 'जेवैक' के साथ कमांड लाइन पर संकलित किया गया और मेरे ग्रहण प्रोजेक्ट में एकीकृत किया गया। मैं अपने प्रोजेक्ट को कमांड लाइन से संकलित करने की कोशिश करूंगा। आपने अतीत में इस समस्या को स्पष्ट रूप से हल किया है और आपके सुझाव शानदार हैं।
grmn.bob 14

3
यदि आपके पास JDK (जिसमें स्रोत हैं), तो आपको ग्रहण में कुछ ब्रेकप्वाइंट जोड़ने में सक्षम होना चाहिए और उम्मीद है कि यह देखना होगा कि यह किस वर्ग को लोड करने का प्रयास कर रहा है। सबसे आसान तरीका शायद UnsupportedClassVersionError (या एक एक्सेप्शन एक्सेप्शन ब्रेकपॉइंट, 'J!' आइकन) के लिए कंस्ट्रक्टर में एक ब्रेकप्वाइंट है, तो आप निरीक्षण कर सकते हैं कि यह वहां कैसे मिला।
जोशुआ मैककिनोन

ठीक है। मुझे इमारत में एक विशेषज्ञ मिला और वह मेरी कमांड लाइन के रूप में उसी जेआरई को ग्रहण करने में सक्षम था। मैंने फिर 1.6 के खिलाफ पुनर्निर्माण किया और 1.6 के खिलाफ भाग गया और यह सब काम कर रहा है। जाहिर है, मैं कुछ भी नहीं बल्कि 1.5 के बारे में गलत था। उसने मुझे दिखाया कि कहाँ देखना है। मदद के लिए धन्यवाद - अब मैं अपनी अगली समस्या पर हूँ! :)
grmn.bob

2
मेरी भी यही समस्या थी। मैंने जो गलती की वह 1.5 JRE और 1.6 कंपाइलर का उपयोग कर रहा था। जो कि असमर्थित त्रुटि को हल नहीं करता है। इसलिए मैंने अपने ग्रहण में 1.6 JRE स्थापित किया और 1.6 संकलक का उपयोग किया। फिर सब कुछ ठीक काम करने लगा।
वंचिनाथन चंद्रशेखरन

1
मैं इसे दूसरी बार बढ़ाना चाहता हूं, क्योंकि यह दूसरी बार है जब मैंने इस मुद्दे को खोजा, खोजा, इस उत्तर को पाया, और यह सही रहा। > _ <
अल्बेअमकीर

9

क्या आपने पूर्ण "क्लीन" करने की कोशिश की है और फिर ग्रहण (प्रोजेक्ट-> क्लीन ...) में पुनर्निर्माण किया है?

क्या आप कमांड लाइन से सीधे "जेवैक" और "जावा" के साथ संकलन और चलाने में सक्षम हैं? क्या वह ठीक से काम करता है?

यदि आप अपनी परियोजना पर राइट क्लिक करते हैं, तो "गुण" पर जाएं और फिर "जावा बिल्ड पाथ" पर जाएं, क्या किसी भी टैब के तहत कोई संदिग्ध प्रविष्टियां हैं? यह अनिवार्य रूप से आपका CLASSPATH है।

ग्रहण की प्राथमिकताओं में, आप "जावा" अनुभाग में "इंस्टॉल किए गए जेआरई" अनुभाग को दोबारा जांचना चाहते हैं और सुनिश्चित करें कि यह मेल खाता है कि आपको क्या सोचना चाहिए।

आपके पास निश्चित रूप से या तो एक बासी .class फ़ाइल है, जो कहीं आसपास बिछी हुई है या आप जिस जावा का उपयोग कर रहे हैं, उसके संकलन-समय / रन-टाइम मिसमैच हो रहे हैं।


हाँ (पूर्ण स्वच्छ); यह कोशिश नहीं की है (cmd लाइन से परियोजना); शायद / नहीं (मैंने ग्रहण "जावा बिल्ड पाथ" से प्रविष्टियाँ हटा दीं); किया कि (JREs - वह है जहां मुझे संस्करण # मिला है)।
grmn.bob 14

5

क्या आपने ग्रहण के साथ संकलन किया? यह एक अलग संकलक (जेवैक नहीं) का उपयोग करता है। इस त्रुटि में परिणाम नहीं होना चाहिए (यदि सब कुछ ठीक से कॉन्फ़िगर किया गया है), लेकिन आप इसके बजाय javac के साथ संकलन करने का प्रयास कर सकते हैं।

यदि यह समस्या ठीक हो गई है, तो यह देखने की कोशिश करें कि क्या ग्रहण में कुछ गलत संकलक सेटिंग्स हैं। विशेष रूप से यह जावा 5 को लक्षित करता है।


यही मैं सीख रहा हूं। मैं दो टुकड़ों को उसी तरह बनाने की कोशिश करने जा रहा हूं (cmd लाइन और / या ग्रहण)।
grmn.bob 14

1
धन्यवाद थिलो, मैंने ग्रहण और जावा और वर्ग संस्करणों के बारे में आज बहुत कुछ सीखा है। और चींटी के बारे में भी थोड़ा ।
grmn.bob

2

मुझे भी वही त्रुटि मिली। इसका कारण मैं मावेन का उपयोग करके परियोजना को संकलित कर रहा था। मेरे पास JDK7 की ओर इशारा करते हुए JAVA_HOME था और इसलिए java 1.7 का उपयोग संकलन के लिए किया जा रहा था और परियोजना को चलाने के दौरान मैं JDK1.5 का उपयोग कर रहा था। नीचे दी गई प्रविष्टि को .classpath फ़ाइल में बदलकर या स्क्रीनशॉट में ग्रहण के रूप में परिवर्तित करने से समस्या हल हो गई।

classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5

या के रूप में चलाने के विन्यास में परिवर्तन यहां छवि विवरण दर्ज करें


1

जावा के उच्च संस्करण के लिए संकलित की गई अपनी परियोजना की किसी भी जार फ़ाइलों की भी जाँच करें। यदि ये आपके स्वयं के पुस्तकालय हैं, तो आप इसे लक्ष्य संस्करण विशेषता को बदलकर javac कर सकते हैं

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">

0

एक अन्य परिदृश्य जहां ऐसा हो सकता है, जब आप एक ग्रहण से (उदाहरण के लिए डिबग आदि) का एक उदाहरण लॉन्च कर रहे हैं - जिस स्थिति में, प्रोजेक्ट के स्तर पर प्रोजेक्ट के स्तर या JRE लाइब्रेरी को बदलना अकेले मदद नहीं करता है। लक्ष्य ग्रहण पर्यावरण को लॉन्च करने के लिए जेआरई क्या मायने रखता है।


0

हमेशा स्पष्ट के लिए भी जाँच करें। मुझे यह त्रुटि एक बार मिली जब मैंने गलती से सर्वर के ऐड के लिए गलत संसाधन को पकड़ लिया और कार्रवाई को हटा दिया। अनदेखी करना आसान हो सकता है।


0

प्रोजेक्ट विशिष्ट सेटिंग्स फ़ाइलें (प्रोजेक्ट कार्यक्षेत्र / प्रोजेक्ट फ़ोल्डर / .settings /) प्रोजेक्ट फ़ोल्डर से हटाना भी करेंगे। जाहिर है, हमें हटाने के बाद एक परियोजना को साफ और निर्माण करने की आवश्यकता है।


0

जावा 1.7 का उपयोग करने के लिए परियोजना को बदलना: इसके लिए उन चरणों का पालन करना है:

  • कंपाइलर कंप्लायंस स्तर बदलें
  • अपने प्रोजेक्ट JRE / JDK को समान स्तर के कुछ में बदलें (मेरे मामले में 1.7)
  • अपनी परियोजना द्वारा संदर्भित सभी परियोजनाओं में समान परिवर्तन करें
  • JRE / JDK (या समान स्तर) का उपयोग करने के लिए अपना रन / डिबग कॉन्फ़िगरेशन बदलें

काम नहीं कर रहा?

  • बिन निर्देशिका हटाएं
  • स्वच्छ
  • फिर से बनाना

अभी भी काम नहीं कर रहा है?

अपनी परियोजना की निर्देशिका में: संपादित करें .settings / org.eclipse.jdt.core.prefs> सुनिश्चित करें कि आपका लक्ष्य लागू है

शुभ लाभ!


0

मैं सर्वर के लिए आवश्यक jre (मेरे मामले में tomcat है) को बदलकर इस समस्या को हल किया। ग्रहण में सर्वर टैब से, सर्वर पर डबल क्लिक करें (सर्वर कॉन्फ़िगरेशन के लिए पृष्ठ खोलने के लिए), रनटाइम वातावरण पर क्लिक करें, फिर आवश्यक JRE बदलें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.