Java.lang.UnsupportedClassVersion त्रुटि को कैसे ठीक करें: असमर्थित major.minor संस्करण




jvm incompatibility (24)

सबसे आम समस्या आपके JAVA_HOME चर का गलत कॉन्फ़िगरेशन है, जिसे आपने एकाधिक जावा डेवलपमेंट किट लाइब्रेरी को इंगित किया है, यदि आपने एकाधिक इंस्टॉल किए हैं।

एसडीके जावा फ़ोल्डर कहां स्थित है, यह जानने के लिए, निम्न आदेश चलाएं:

jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));'

Debian / Ubuntu

यह जांचने के लिए कि आपने कौन सा जावा (openjdk) स्थापित किया है, इसके माध्यम से जांचें:

dpkg -l "openjdk*" | grep ^i

या:

update-java-alternatives -l

इसे बदलने के लिए, उपयोग करें:

update-alternatives --config java

यदि आवश्यक हो तो सूडो के साथ उपसर्ग।

वैकल्पिक जावा संस्करण का चयन करने के लिए।

या जांच के लिए जो उपलब्ध हैं जांचें:

apt-cache search ^openjdk

यदि आवश्यक हो तो सूडो के साथ उपसर्ग।

फिर आप स्थापित कर सकते हैं, उदाहरण के लिए:

apt-get install openjdk-7-jre

यदि आवश्यक हो तो सूडो के साथ उपसर्ग।

फेडोरा, ओरेकल लिनक्स, रेड हैट

उचित पैकेज को स्थापित / अपग्रेड करें:

yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel

java-1.7.0-openjdk पैकेज में केवल जावा रनटाइम पर्यावरण है। यदि आप जावा प्रोग्राम विकसित करना चाहते हैं तो java-1.7.0-openjdk-devel पैकेज स्थापित करें।

बीएसडी

फ्रीबीएसडी पोर्ट्स संग्रह में openjdk7 7 पैकेज है जिसे openjdk7 7 कहा जाता है जिसे शायद पुन: कॉन्फ़िगर किया जाना चाहिए।

देखें: ओपनजेडीके विकी पेज

विंडोज

बस ओरेकल साइट से स्थापित जावा एसई डेवलपमेंट किट लाइब्रेरी स्थापित करें या इंस्टॉल करें

जेनकींस

यदि आप जेनकींस के साथ इस समस्या का सामना कर रहे हैं, तो देखें:

हालांकि update-alternatives साथ जावा (नए) का सही संस्करण चुनना चाहिए।

मैं Notepad++ का उपयोग करने की कोशिश कर रहा हूं क्योंकि मेरे ऑल-इन-वन टूल एडिट, रन, कंपाइल इत्यादि।

मेरे पास JRE स्थापित है, और मैंने अपना पथ चर ... / bin निर्देशिका में सेट किया है।

जब मैं नोटपैड ++ में अपनी "हैलो वर्ल्ड" चलाता हूं, तो मुझे यह संदेश मिलता है:

java.lang.UnsupportedClassVersionError: test_hello_world :
 Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
       .........................................

मुझे लगता है कि यहां समस्या संस्करणों के बारे में है; जावा का कुछ संस्करण पुराना या बहुत नया हो सकता है।

  1. मैं इसे कैसे ठीक करूं?
  2. क्या मुझे जेडीके इंस्टॉल करना चाहिए, और जेआरई के बजाय जेडीके में अपना पथ वैरिएबल सेट करना चाहिए?
  3. जेआरई या जेडीके में PATH चर के बीच क्या अंतर है?

आज, यह त्रुटि संदेश हमारे टॉमकैट 7 में उबंटू 12.04.2 एलटीएस (सटीक पांगोलिन ) पर दिखाई दिया:

/var/log/tomcat7/localhost.2014-04-08.log:
8 अप्रैल, 2014 9:00:55 पूर्वाह्न org.apache.catalina.core.StandardContext फ़िल्टर स्टार्ट
सेवर: अपवाद फ़िल्टर स्ट्रैट्स 2 शुरू करना
java.lang.UnsupportedClassVersionError: नियंत्रक / ReqAccept: असमर्थित major.minor संस्करण 51.0 (कक्षा नियंत्रक लोड करने में असमर्थ। ReqAccept)

Struts एप्लिकेशन जावा 7 के साथ संकलित है।

यह निकला, कोई टॉमकैट 7 को पुनरारंभ करने के लिए "सेवा टोमकैट [स्टॉप / स्टार्ट]" का उपयोग करता है,

$ ps -ef | grep जावा
tomcat7 31783 1 32 20:13? 00:00:03 / usr / lib / jvm / default-java / bin / java ...
$ / usr / lib / jvm / default-java / bin / java -version
जावा संस्करण "1.6.0_27"

जो "असमर्थित major.minor संस्करण 51.0" त्रुटि का कारण बनता है।

जब हमने टॉमकैट 7 को पुनरारंभ करने के लिए "/etc/init.d/tomcat7 [stop / start]" का उपयोग किया, तो समस्या हल हो गई।

$ ps -ef | grep जावा
tomcat7 31886 1 80 20:24? 00:00:10 /usr/local/java/jdk1.7.0_15/bin/java
$ /usr/local/java/jdk1.7.0_15/bin/java -version
जावा संस्करण "1.7.0_15"


मुझे समस्या थी जिससे मुझे अपने यूनिट परीक्षण चलाने के लिए कमांड लाइन से मेरी परियोजना पर एक मेवेन संकलन चलाया जा रहा था; अगर मैंने टेस्ट क्लास में बदलाव किया है और एक्लिप्स को स्वचालित रूप से फिर से कंपाइल करने दें, तो मुझे "असमर्थित major.minor संस्करण 51.0" त्रुटि मिली।

मेरे पास जेडीके 6 और जेडीके 7 दोनों स्थापित हैं, लेकिन मेरी सभी जेआरई सेटिंग्स पोल में और ग्रहण में प्रोजेक्ट प्रॉपर्टी पेज से 1.6 पर इंगित कर रही थीं। मेवेन अपडेट प्रोजेक्ट की कोई मात्रा नहीं है और / या रीफ्रेशिंग ने इसे हल किया है।

अंत में मैंने परियोजना को बंद करने और इसे फिर से खोलने की कोशिश की, और यह ठीक करने लग रहा था! HTH


जब मैं अपने आवेदन को बनाने के लिए एक Ant स्क्रिप्ट के साथ काम कर रहा था तो मुझे एक ही समस्या का सामना करना पड़ा।

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

मैंने उस अनुभाग में एंट स्क्रिप्ट को संशोधित किया जहां यह जावा फाइलों को संकलित करता है।

<target name="build-java" depends="prepare-build">
    <echo message="Compiling java files"/>
    <javac ....
           target="1.5"...
    </javac>
</target>

यह असमर्थित प्रमुख मामूली मुद्दे को हल करने के लिए मेरे लिए काम करता है।


जैसा कि कई लोगों द्वारा कहीं और उत्तर दिया गया है, जावा प्रोग्राम जावा के पुराने संस्करण पर चलाया जा रहा है, जिसकी इसे संकलित किया गया था। पिछड़े संगतता के लिए इसे "क्रॉसकंपिल्ड" होना चाहिए। इसे एक और तरीके से रखने के लिए, स्रोत और लक्ष्य जावा संस्करणों के बीच एक मेल नहीं है।

ग्रहण मेनू में बदलते विकल्प मूल पोस्टर का जवाब नहीं देते हैं, जिन्होंने कहा कि वह ग्रहण का उपयोग नहीं कर रहा है। OpenJDK javac संस्करण 1.7 पर, यदि आप पैरामीटर- -source और- -target उपयोग करते हैं, तो आप 1.6 के लिए क्रॉसकंपाइल कर सकते हैं, साथ ही संकलन समय पर लक्ष्य संस्करण (यानी पुराना एक) का rt.jar -file प्रदान करते हैं। यदि आप वास्तव में 1.6 जेआरई स्थापित करते हैं, तो आप इसकी स्थापना को इंगित कर सकते हैं (उदाहरण के लिए, उबंटू, / usr / jdk / jdk1 पर /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar पर। 6.0_60 / जेआर / lib / rt.jar स्पष्ट रूप से सनोस पर। क्षमा करें, मुझे नहीं पता कि यह विंडोज सिस्टम पर कहां है)। इस तरह:

javac -source 1.6 -target 1.6 -bootclasspath /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar HelloWorld.java

ऐसा लगता है कि आप इंटरनेट से rt.jar डाउनलोड कर सकते हैं, और इसे इंगित कर सकते हैं। हालांकि यह बहुत सुरुचिपूर्ण नहीं है:

javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java

ओह मैक ओएस एक्सआई JAVA_HOME चर सेट करके इस समस्या को हल करने में सक्षम था:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home

चिंता मत करो, मुझे हल हो गया।

यह वास्तव में सरल है - आपको एक ही संस्करण के साथ दोनों जेआरई / जेडीके स्थापित करने की आवश्यकता है।

जेआरई 6 -> जेडीके 6

जेआरई 7 -> जेडीके 7

और इसी तरह।


आपने अपनी जावा क्लास जेडीके 7 के साथ संकलित की है और आप जेडीके 6 पर एक ही कक्षा को चलाने की कोशिश कर रहे हैं।


दिखाया गया संस्करण संख्या जेआरई के संस्करण का वर्णन करती है, कक्षा फ़ाइल के साथ संगत है।

रिपोर्ट की गई प्रमुख संख्याएं हैं:

Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

(स्रोत: Wikipedia )

वास्तविक समस्या को ठीक करने के लिए आपको या तो Java JRE के नए संस्करण के साथ जावा कोड चलाने या जावा कंपाइलर को लक्षित पैरामीटर निर्दिष्ट करने के लिए संकलक को पुराने जावा संस्करणों के साथ संगत कोड बनाने के निर्देश देने के लिए प्रयास करना चाहिए।

उदाहरण के लिए, जावा 1.4 के साथ संगत कक्षा फ़ाइलों को उत्पन्न करने के लिए, निम्न कमांड लाइन का उपयोग करें:

javac -target 1.4 HelloWorld.java

जावा कंपाइलर के नए संस्करणों के साथ आपको बूटस्ट्रैप क्लास पथ सेट नहीं होने के बारे में चेतावनी मिल सकती है। इस त्रुटि के बारे में अधिक जानकारी ब्लॉग पोस्ट में उपलब्ध है, बिना बूटक्लासपैथ के पुराने स्रोत को सेट करने के लिए नई जावैक चेतावनी


यदि आप Maven का उपयोग करते समय इस समस्या का सामना कर रहे हैं, तो आप प्लग-इन मेवेन कंपाइलर का उपयोग करके अपने कोड को संकलित कर सकते हैं।

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
       .....

अद्यतन: यदि आप जेडीके 8 का उपयोग कर रहे हैं, तो source और target 1.8 सेट करें।


जब मैंने JDK 1.7 स्थापित किया, तो समस्या हल हो गई।


ग्रहण में, मैं बस मेनू कमांड विंडो -> प्राथमिकताएं -> जावा -> कंपाइलर पर गया और फिर "कंपाइलर अनुपालन स्तर" को 1.6 पर सेट किया।


आपने जेडीके / JRE निचले संस्करण से भागने और चलाने की कोशिश करने के लिए जेडीके का उच्च संस्करण उपयोग किया है।

इसे देखने के लिए, संस्करण जानकारी देखें:

javac -version

java -version

वे अलग होंगे और जावैक में उच्च संस्करण संख्या होगी।

इसके आस-पास पहुंचने के लिए, जेडीके संस्करण से जावा का उपयोग करके चलाएं या यदि आपके पास एक नया जेआरई / जेडीके है जो भी काम करेगा।

which javac आपको स्थान बताएगा, उदाहरण के लिए, /usr/bin/javac । बस /usr/bin/java <program> का उपयोग करके सीधे चलाएं।

या आप पर्यावरण चर को स्थायी समाधान के रूप में सेट कर सकते हैं।


मैक पर मेरी एक ही स्थिति थी, और निम्नलिखित प्रक्रिया मेरे लिए काम करती थी:

टर्मिनल में टाइप करें

vi ~/.profile

फिर फ़ाइल में इस लाइन को जोड़ें, और सहेजें

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home

जहां संस्करण आपके कंप्यूटर पर है, जैसे कि 1.7.0_25

संपादक से बाहर निकलें, फिर निम्न आदेश टाइप करें इसे प्रभावी बनें

source ~/.profile 

फिर परिणाम की जांच करने के लिए जावा-वर्जन टाइप करें

java -version 

.profile फ़ाइल क्या है?

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

स्रोत: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515


जब मैं जावा 6 पर वापस लौटा तो यह समस्या थी और जावा 7 के साथ पहले संकलित कक्षाओं को चलाने की कोशिश की। मेरे लिए क्या काम किया गया था प्राथमिकता> जावा> कंपाइलर -> अनुपालन स्तर 1.6 पर सेट करें और महत्वपूर्ण रूप से "परियोजना सेटिंग्स कॉन्फ़िगर करें" ..


आपके पास जावा 7 में संकलित कुछ जेएआर लाइब्रेरी हो सकती है, और आपके पास जावा रनटाइम के रूप में केवल जावा 6 है। यह कुछ नए पुस्तकालयों के साथ हो सकता है।


java.lang.UnsupportedClassVersionError रनटाइम के दौरान संकलन समय और कम जेडीके के दौरान उच्च जेडीके की वजह से होती है।


इस पर आधारित...

J2SE 8 = 52
J2SE 7 = 51
J2SE 6.0 = 50
J2SE 5.0 = 49
JDK 1.4 = 48
JDK 1.3 = 47
JDK 1.2 = 46
JDK 1.1 = 45

ग्रहण में, पैकेज एक्सप्लोरर में प्रोजेक्ट पर राइट क्लिक करें:

पथ बनाएं -> बिल्ड पथ कॉन्फ़िगर करें

के अंतर्गत:

जावा बिल्ड पथ -> पुस्तकालय -> लाइब्रेरी जोड़ें -> जेआरई सिस्टम लाइब्रेरी -> स्थापित जेआरई -> खोज

खोज पूर्ण होने के बाद उपलब्ध सूची में लाइब्रेरी का चयन करके आवश्यक जेआरई जोड़ें।


मैं इसे कैसे ठीक करूं?

इस त्रुटि का अर्थ है कि जेआरई जिसका उपयोग आपके क्लास कोड को निष्पादित करने के लिए किया जा रहा है, जावा का संस्करण इस्तेमाल नहीं करता है। आम तौर पर क्योंकि जावा का संस्करण जिसने आपकी कक्षा फ़ाइल जेनरेट की है (यानी इसे संकलित किया गया है) नया है।

इसे ठीक करने के लिए, आप या तो कर सकते हैं

ए) अपने जावा स्रोतों को जावा कंपाइलर के समान, या पुराने, संस्करण के साथ संकलित करें, इसे चलाने के लिए उपयोग किया जाएगा। यानी उपयुक्त जेडीके स्थापित करें।

बी) जावा कंपाइलर के नए संस्करण के साथ अपने संगतता मोड में अपने जावा स्रोतों को संकलित करें। यानी -target पैरामीटर का उपयोग करें।

सी) एक जेआरई में अपनी संकलित कक्षाएं चलाएं जो कक्षाओं को संकलित करने के लिए उपयोग किए जाने वाले जेडीके के समान, या नया, संस्करण है।

आप उन संस्करणों की जांच कर सकते हैं जिन्हें आप वर्तमान में कंपाइलर के लिए javac -version java -version साथ उपयोग कर रहे हैं, और रनटाइम के लिए java -version

क्या मुझे जेडीके इंस्टॉल करना चाहिए, और जेआरई के बजाय जेडीके में अपना पाथ वैरिएबल सेट करना चाहिए?

संकलन के लिए, निश्चित रूप से, इच्छित जेडीके को स्थापित और कॉन्फ़िगर करें जो आप चाहते हैं।

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

जेआरई या जेडीके में पैथ चर के बीच क्या अंतर है?

पाथ पर्यावरण परिवर्तक कमांड खोल को बताता है जहां आप टाइप कमांड को देखना चाहते हैं। जब आप java टाइप करते हैं, तो कमांड शेल दुभाषिया चलाने के लिए उचित java रनटाइम निष्पादन योग्य खोजने के लिए, बाएं से दाएं, PATH चर में निर्दिष्ट सभी स्थानों को देखेगा। यदि आपके पास जावा के कई संस्करण स्थापित हैं - यानी आपके पास पाथ वैरिएबल में निर्दिष्ट कई स्थानों में java निष्पादन योग्य है, तो बाएं से दाएं जाने पर पहली बार सामना किया जाने वाला पहला व्यक्ति निष्पादित किया जाएगा।

कंपाइलर कमांड javac और केवल javac साथ आता है। रनटाइम कमांड java और जेडीके के साथ आता है और जेआरई में है।

यह संभावना है कि आपके पास जावा संस्करण का एक संस्करण (51.0 = जावा 7) स्थापित है, और आपके पास java का एक ही संस्करण स्थापित है, लेकिन java का एक और पिछला संस्करण पहले पाथ में दिखाई दे रहा है और इसलिए इसे बजाया जा रहा है एक आप उम्मीद करते हैं।


मैंने इसे हल किया। मैं भाग गया:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386

त्रुटि भ्रामक है, Unsupported major.minor version 51.0 । यह इंप्रेशन देता है कि संस्करण 51 (जावा 7) समर्थित नहीं है। और हमें जावा 6 का उपयोग करना चाहिए।

त्रुटि होनी चाहिए:

वर्तमान जावा संस्करण, 50, असमर्थित है। इसके बजाय जावा संस्करण 7 (51: 0 और अधिक) का उपयोग करें


एक्लिप्स से चींटी चलाते समय मुझे एक ही त्रुटि संदेश था, लेकिन यहां उल्लेखित अन्य समाधानों ने मेरी समस्या का समाधान नहीं किया। मजाकिया बात यह थी कि विंडोज कमांड लाइन से चींटी चलाना ठीक चल रहा था, इसलिए इसे ग्रहण के भीतर कॉन्फ़िगरेशन समस्या होनी चाहिए।

यह पता चला कि ग्रहण के तहत आप पर्यावरण को निर्दिष्ट कर सकते हैं कि चींटी के साथ चलना चाहिए और इसे जेडीके के बजाय जेआरई के रूप में सेट किया गया था।

  • यहां जाएं: चलाएं -> बाहरी उपकरण -> बाहरी उपकरण विन्यास ...
  • अपनी परियोजना के लिए Ant build.xml का चयन करें (यदि आपके पास एकाधिक प्रोजेक्ट हैं)
  • टैब 'जेआरई' सक्रिय करें
  • यहां 'अलग जेआरई: जेआर 6' चुना गया था। जब मैंने इसे 1.6 या 1.7 श्रृंखला से जेडीके में बदल दिया, तो त्रुटि समाप्त हो गई।

  • जेडीके 7.0.55 स्थापित करें और जेडीके 7.0.55 के लिए जावा के लिए Eclipse सेट करें।
  • बिल्ड पथ जेडीके 7.0.55 पर कॉन्फ़िगर करके जेडीके 7.0.55 के साथ प्रोजेक्ट बनाएं।
  • मेनू द्वारा जेडीके 7.0.55 के लिए ग्रहण में कंपाइलर सेट करें -> प्राथमिकताएं -> जावा -> कंपाइलर - 1.7 चुनें।

सबसे पहले कुछ मूलभूत बातें प्राप्त करें ...

जेआरई NetBeans / Eclipse / स्टैंडअलोन में एक घटक है जो आपको पुस्तकालयों, जेवीएम, जावा प्लगइन्स और जावा वेब स्टार्ट प्रदान करने जा रहा है। ध्यान दें कि यह शिकायतकर्ता या डिबगर्स प्रदान नहीं करता है।

जेडीके शिकायतकर्ता और डिबगर्स के साथ जेआरई का सुपरसेट है।

तो जब आपके पास जेडीके की बजाय जेआरई के रूप में आपकी डिफ़ॉल्ट लाइब्रेरी है, तो आपके पास सामान आयात करने में अच्छा समय होगा, लेकिन यह संकलित नहीं होगा।

इसके बजाए, अपना रास्ता जेडीके पर सेट करें (मैं नेटबीन का उपयोग करता हूं, और मैंने netbeans.conf का उपयोग netbeans / etc / netbeans.conf में सेट किया है और पथ को बदल दिया है)।


मुझे 1.7 में लिखे गए प्रोजेक्ट के साथ एक ही समस्या मिली और 1.6 में निष्पादित करने की कोशिश की।

ग्रहण में मेरा समाधान:

  • अपने प्रोजेक्ट प्रॉपर्टीज पर राइट क्लिक करें -> जावा बिल्ड पथ -> लाइब्रेरीज़

  • अपनी जेआरई सिस्टम लाइब्रेरी का चयन करें और दाईं ओर संपादित करें पर क्लिक करें , और लक्ष्य जेआरई चुनें।

  • अब बाईं ओर जावा कंपाइलर पर जाएं, और कंपाइलर अनुपालन स्तर को अपने लक्ष्य में बदलें।

यह मेरे लिए काम किया।





unsupported-class-version