วิธีแก้ไข java.lang.UnsupportedClassVersionError: รุ่น Major.minor ไม่สนับสนุน


1572

ฉันกำลังพยายามใช้Notepad ++เป็นเครื่องมือในการแก้ไข, เรียกใช้, คอมไพล์และอื่น ๆ

ฉันติดตั้งJREแล้วและได้ตั้งค่าตัวแปรพา ธ ของฉันไปยัง.../binไดเรกทอรี

เมื่อฉันเรียกใช้ "Hello world" ใน Notepad ++ ฉันได้รับข้อความนี้:

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)
       .........................................

ฉันคิดว่าปัญหานี่เป็นเรื่องเกี่ยวกับรุ่น; Java บางเวอร์ชันอาจเก่าหรือใหม่เกินไป

  1. ฉันจะแก้ไขได้อย่างไร
  2. ฉันควรติดตั้ง JDK และตั้งค่าตัวแปรเส้นทางของฉันเป็น JDK แทนที่จะเป็น JRE หรือไม่
  3. อะไรคือความแตกต่างระหว่างPATHตัวแปรใน JRE หรือ JDK

คุณติดตั้ง jdk ด้วยหรือเปล่า? jre คือสภาพแวดล้อม Java RunTime ในการสร้างแอป Java คุณต้องมี jdk ด้วย
— CyprUS

ใช่ฉันทำและตอนนี้ตัวแปรพา ธ ของฉันชี้ไปที่ตำแหน่ง jdk แต่ฉันยังมีข้อผิดพลาด "รุ่นรองที่ไม่รองรับ 51.0" คุณคิดว่าฉันควรติดตั้ง jdk รุ่นเก่ากว่านี้หรือไม่? ฉันใช้ jdk 1.7.0
— ERJAN

20
สิ่งนี้เกิดขึ้นกับฉันใน Mac OS X เมื่อฉันมีปัญหาเนื่องจากสถานการณ์แปลก ๆ ของ Apple java 6 และ Oracle java 7 บน OSX ในปัจจุบัน เวอร์ชั่นสั้น: คอมไพล์ด้วย JDK7, รันด้วย JDK6, รับสิ่งนี้
— Warren P

7
ใน java ClassName ควรจะเริ่มต้นด้วยอักษรตัวใหญ่;)
— Ashish Panery

5
สำหรับ El Captain คำตอบนี้จะแก้ไขให้ฉัน: stackoverflow.com/a/34201991/1615594
— tsuz

คำตอบ:


1940

หมายเลขเวอร์ชั่นที่แสดงอธิบายถึงเวอร์ชั่นของ JRE ที่ไฟล์คลาสใช้งานร่วมกันได้

ตัวเลขหลักที่รายงานคือ:

Java SE 14 = 58,
Java SE 13 = 57,
Java SE 12 = 56,
Java SE 11 = 55,
Java SE 10 = 54,
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 ด้วย Java JRE เวอร์ชันใหม่หรือระบุพารามิเตอร์เป้าหมายให้กับคอมไพเลอร์ Java เพื่อสั่งให้คอมไพเลอร์สร้างโค้ดที่เข้ากันได้กับเวอร์ชัน Java ก่อนหน้า

ตัวอย่างเช่นเพื่อสร้างไฟล์คลาสที่เข้ากันได้กับ Java 1.4 ให้ใช้บรรทัดคำสั่งต่อไปนี้:

javac -target 1.4 HelloWorld.java

ด้วยคอมไพเลอร์ Java เวอร์ชันใหม่คุณอาจได้รับคำเตือนเกี่ยวกับเส้นทางคลาส bootstrap ที่ไม่ได้ถูกตั้งค่า ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดนี้มีอยู่ในโพสต์บล็อกใหม่เตือน javac สำหรับการตั้งค่าเป็นแหล่งที่มีอายุมากกว่าโดยไม่ต้อง bootclasspath


167
"หมายเลขเวอร์ชั่นที่แสดงอธิบายว่าเป็นเวอร์ชั่นใดหากใช้ Java เพื่อคอมไพล์โค้ด" ไม่มันไม่ ซึ่งแสดงเวอร์ชันของ JRE ที่ไฟล์คลาสเข้ากันได้ การใช้ตัวเลือกการคอมไพล์ข้ามคุณสามารถใช้ 1.7 JDK เพื่อคอมไพล์โค้ดด้วยคลาสเวอร์ชัน 1.1 (ถึง 1.7)
— Andrew Thompson

85
คำตอบนี้ไม่ได้อธิบายวิธีการแก้ไขตามคำถามที่ถาม?
— Jonathan Leung

7
นี่เป็นทางออกที่ดีสำหรับการรวบรวมเป็นเวอร์ชันก่อนหน้าจาก Eclipse โดยตรง: stackoverflow.com/a/16345710/2091700
— Alphaaa

19
ในโครงการ eclipse => Proerties => คอมไพเลอร์ java; ตั้งค่า "ระดับการปฏิบัติตามคอมไพเลอร์" เป็นเวอร์ชันตาม jre หรือ jdk ของคุณ สำหรับฉันมันคือ 1.6 สำหรับ jre 1.6
— Sam

5
สิ่งนี้อาจเกิดขึ้นเมื่อคอมไพเลอร์ถูกตั้งค่าในการไม่ปฏิบัติตาม JRE / JDK ที่รวบรวมในปัจจุบัน ตัวอย่างเช่นฉันพบค่าด้านล่างจากโฟลเดอร์ eclipse .settings, org.eclipse.jdt.core.compiler.compliance = 1.7, org.eclipse.jdt.core.compiler.source = 1.7, org.eclipse.jdt.core.compiler .codegen.targetPlatform = 1.7 และคอมไพเลอร์ของฉันคือ 1.6.0_32 ปัญหาได้รับการแก้ไขหลังจากเปลี่ยนค่าเป็น 1.6 ปัญหาเกิดขึ้นหลังจากที่ฉันคัดลอกโครงการจากพื้นที่ทำงานอื่นที่ฉันใช้ JDK 1.7 :(
— Gana

366

java.lang.UnsupportedClassVersionError เกิดขึ้นเนื่องจาก JDK ที่สูงขึ้นในระหว่างเวลารวบรวมและ JDK ที่ลดลงในระหว่างการใช้งานจริง


11
+1: การเปลี่ยนลิงก์สัญลักษณ์นี้ ( /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java) เป็นเวอร์ชันที่ใช้สำหรับการคอมไพล์ด้วย javac แก้ปัญหาได้แล้ว
— ezdazuzena

1
ฉันจะทำการเปลี่ยนแปลงข้างต้นได้อย่างไร
— Ankur Raiyani

8
โครงการ -> คุณสมบัติ -> Java Compiler เปิดใช้งานการตั้งค่าเฉพาะของโครงการ จากนั้นเลือก Compiler Compliance Level เป็น 1.7, 1.6 หรือ 1.5, สร้างและทดสอบแอปของคุณ
— Vivek Kumar Ray

เมื่อฉันย้ายไปยัง Java 7 Eclipse พยายามที่จะรันใน Java 6 ต่อไป ... ไม่รู้เลยว่าทำไม ถอนการติดตั้ง JDK เก่าทำเคล็ดลับสำหรับฉัน
— HDave

9
@ezdazuzena ใช้sudo update-alternatives --config javaในการทำเช่นนั้น
— Thorbjørn Ravn Andersen

115

ใน Eclipse ฉันไปที่เมนูคำสั่งWindow -> Preferences -> Java -> คอมไพเลอร์จากนั้นตั้งค่า "Compiler Compliance level" เป็น 1.6


3
ใน eclipse บางครั้งโปรเจ็กต์ facets จำเป็นต้องเปลี่ยนเป็นเวอร์ชัน java ที่เหมาะสม
— Bilal Mirza

6
ขอบคุณ เป็นที่น่าสังเกตว่าการตั้งค่าสภาพแวดล้อมการดำเนินการเริ่มต้นของ Eclipse (JRE ที่ดำเนินการต่อบนเส้นทางการสร้าง) เป็นการตั้งค่าแยกต่างหาก ฉันตั้งค่า JRE แล้ว แต่ไม่ใช่ระดับความสอดคล้องของคอมไพเลอร์ นี้แก้ไขได้
— wchargin

และคุณวาดข้อสรุปจากข้อความแสดงข้อผิดพลาดว่านี่เป็นสถานที่ที่เหมาะสมในการตั้งค่าตัวเลือกได้อย่างไร
— Alexander

อาจเป็นเช่นนี้: stackoverflow.com/questions/7073485/…สามารถช่วยได้หากคุณใช้ ant และ eclipse
— OuuGiii

คำถามเกี่ยวกับ Notepad ++ แต่ไม่ใช่ Eclipse
— gotwo

60

ไม่ต้องกังวลฉันได้รับการแก้ไขแล้ว

มันง่ายมาก - คุณต้องติดตั้งทั้ง JRE / JDK ด้วยเวอร์ชั่นเดียวกัน

JRE 6 -> JDK 6

JRE 7 -> JDK 7

และอื่น ๆ


29
java 7 สามารถรองรับ 6 ได้โดยไม่มีปัญหาใด ๆ เช่นกัน
— damienix

@damienix คุณอาจต้องการระบุว่า Java 7 JRE สามารถจัดการกับคลาสที่คอมไพล์ Java 6 ได้โดยไม่มีปัญหามิฉะนั้นคำสั่งของคุณจะทำให้เกิดความสับสน
— Frontear

43

ข้อผิดพลาดนี้หมายความว่าคุณกำลังพยายามโหลดไฟล์ "class" ของ Java ที่รวบรวมด้วย Java เวอร์ชันใหม่กว่าที่คุณติดตั้งไว้

ตัวอย่างเช่น.classไฟล์ของคุณอาจได้รับการรวบรวมสำหรับ JDK 7 และคุณพยายามเรียกใช้ด้วย JDK 6

ดังนั้นทางออกคือ:

  • อัพเกรด Java runtime หรือ
  • คอมไพล์คลาสใหม่หากคุณมีซอร์สโดยใช้คอมไพเลอร์ Java ในเครื่องของคุณ (ถ้ามี)

    javac FileName.java

สำหรับนักพัฒนาสิ่งนี้สามารถเกิดขึ้นได้หากนักพัฒนาคนอื่นทำการตรวจสอบในไฟล์. class และพวกเขามีจาวาเวอร์ชันใหม่กว่าที่คุณมี!


22

คุณกำลังพยายามเรียกใช้โปรแกรมของคุณด้วยรุ่น Java ที่ไม่รองรับรุ่นที่มีการรวบรวมรหัส ดังนั้นโดยทั่วไปคุณจะต้องรวบรวมรหัสของคุณด้วยเวอร์ชันที่สูงกว่าและพยายามเรียกใช้โดยใช้เวอร์ชันที่ต่ำกว่า

ตามที่คุณได้รับ

Unsupported major.minor version 51.0

และรุ่น51.0สอดคล้องกับJ2SE 7คุณอาจจะรวบรวมรหัสของคุณใน Java 7 และพยายามที่จะเรียกใช้โดยใช้รุ่นที่ต่ำกว่า ตรวจสอบสิ่งที่java -versionแสดง ควรเป็นรุ่น Java 7 หากไม่ทำการเปลี่ยนแปลงที่เหมาะสมใน PATH / JAVA_HOME หรือคุณสามารถคอมไพล์ด้วยเวอร์ชันเดียวกันกับที่คุณพยายามรันโค้ด หากการกำหนดค่าที่จะทำให้เกิดความสับสนคุณก็สามารถให้เส้นทางที่แน่นอนและ/home/user/jdk1.7.0_11/bin/javac/home/user/jdk1.7.0_11/bin/java


18

ฉันมีสถานการณ์ที่คล้ายกันบน Mac และกระบวนการต่อไปนี้ได้ผลสำหรับฉัน:

ในเทอร์มินัลพิมพ์

vi ~/.profile

จากนั้นเพิ่มบรรทัดนี้ในไฟล์และบันทึก

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

1.7.0_25ที่รุ่นเป็นหนึ่งในคอมพิวเตอร์ของคุณเช่น

ออกจากตัวแก้ไขจากนั้นพิมพ์คำสั่งต่อไปนี้เพื่อให้มีประสิทธิภาพ

source ~/.profile 

จากนั้นพิมพ์ java -version เพื่อตรวจสอบผลลัพธ์

java -version 

.profileไฟล์คืออะไร?

ไฟล์. profile เป็นไฟล์ที่ซ่อนอยู่ มันเป็นไฟล์ทางเลือกที่บอกระบบว่าคำสั่งให้รันเมื่อผู้ใช้ที่มีไฟล์โพรไฟล์มันเข้าสู่ระบบตัวอย่างเช่นถ้าชื่อผู้ใช้ของฉันคือ bruno และมีไฟล์. profile ใน / Users / bruno / เนื้อหาทั้งหมดของมัน จะถูกดำเนินการในระหว่างกระบวนการเข้าสู่ระบบ

แหล่งที่มา: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515


16

ในหน้าต่างเมนูของ Eclipse -> Preferences -> Java -> คอมไพเลอร์ตรวจสอบด้วย "กำหนดการตั้งค่าเฉพาะโครงการ"

หากคุณยังมีข้อผิดพลาดกับ Java เวอร์ชันเดียวกันให้ลองลบโฟลเดอร์บิลด์ของโปรเจคด้วยตนเอง จากนั้นรีสตาร์ท Eclipse


14

คุณสามารถรวบรวมไลบรารี JAR บางส่วนใน Java 7 และคุณมี Java 6 เป็น Java Runtime เท่านั้น มันอาจเกิดขึ้นกับห้องสมุดใหม่บางแห่ง


14

ปัญหาที่พบบ่อยที่สุดคือการกำหนดค่าJAVA_HOMEตัวแปรของคุณผิดซึ่งควรชี้ไปที่ไลบรารี Java Development Kit ที่ถูกต้องหากคุณติดตั้งหลายตัว

หากต้องการค้นหาตำแหน่งของโฟลเดอร์ SDK Java ให้รันคำสั่งต่อไปนี้:

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

Debian / Ubuntu

ในการตรวจสอบว่าคุณได้ติดตั้ง java (openjdk) ใดให้ตรวจสอบผ่าน:

dpkg -l "openjdk*" | grep ^i

หรือ:

update-java-alternatives -l

หากต้องการเปลี่ยนให้ใช้:

update-alternatives --config java

นำหน้าด้วยsudoถ้าจำเป็น

เพื่อเลือกเวอร์ชัน Java ทางเลือก

หรือตรวจสอบว่ามีการติดตั้งใดให้ทำดังนี้

apt-cache search ^openjdk

นำหน้าด้วยsudoถ้าจำเป็น

จากนั้นคุณสามารถติดตั้งตัวอย่างเช่น:

apt-get install openjdk-7-jre

นำหน้าด้วยsudoถ้าจำเป็น

Fedora, Oracle Linux, Red Hat

ติดตั้ง / อัพเกรดแพ็คเกจที่เหมาะสมผ่าน:

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

java-1.7.0-openjdkแพคเกจประกอบด้วยเพียง Java Runtime Environment หากคุณต้องการพัฒนาโปรแกรม Java ให้ติดตั้งjava-1.7.0-openjdk-develแพ็คเกจ

BSD

มีแพ็คเกจ OpenJDK 7 ในคอลเลกชัน FreeBSD Ports ที่เรียกว่าopenjdk7ซึ่งอาจต้องมีการกำหนดค่าใหม่

ดู: OpenJDK wiki หน้า

ของ windows

เพียงติดตั้งไลบรารี Java SE Development Kit ที่เหมาะสมจากไซต์ Oracleหรือติดตั้ง

เจนกินส์

หากคุณประสบปัญหานี้กับเจนกินส์โปรดดู:

อย่างไรก็ตามการเลือกรุ่นที่ถูกต้องของ Java (ใหม่กว่า) ด้วยupdate-alternativesควรใช้งานได้


คำตอบนี้ใช้ได้สำหรับฉันเมื่อพยายามใช้ spark2-shell บนโฮสต์หลังจากเพิ่มบริการ spark ในคลัสเตอร์ที่มี cloudera
— แก้ไข

12

ฉันประสบปัญหาเดียวกันเมื่อฉันทำงานกับAnt script เพื่อสร้างแอปพลิเคชันของฉัน

ฉันใช้Eclipseสำหรับการพัฒนาแอปพลิเคชันของฉันและฉันเปลี่ยนเวอร์ชั่นคอมไพเลอร์ในคุณสมบัติบิลด์ของโครงการ แต่นั่นไม่ได้ผลสำหรับฉัน จากนั้นฉันก็พบว่าฉันสามารถให้เวอร์ชั่นคอมไพเลอร์ในสคริปต์ Ant

ฉันแก้ไขสคริปต์ Ant ที่ส่วนที่รวบรวมไฟล์ Java

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

สิ่งนี้ทำงานให้ฉันเพื่อแก้ไขปัญหาเล็กน้อยที่สำคัญที่ไม่ได้รับการสนับสนุน



12

ฉันมีปัญหาเดียวกันกับโครงการที่เขียนใน 1.7 และพยายามที่จะดำเนินการใน 1.6

โซลูชันของฉันใน Eclipse:

  • คลิกขวาที่คุณสมบัติโครงการ-> เส้นทางสร้าง Java -> ไลบรารี

  • เลือกไลบรารีระบบ JRE ของคุณและคลิกแก้ไขทางด้านขวาและเลือกเป้าหมาย JRE

  • ตอนนี้ไปที่Java Compilerทางด้านซ้ายและเปลี่ยนระดับการปฏิบัติตามคอมไพเลอร์เป็นเป้าหมายของคุณ

ที่ทำงานให้ฉัน


11

ตามที่ได้รับคำตอบจากหลาย ๆ คนโปรแกรมจาวากำลังทำงานบน Java เวอร์ชันเก่ากว่าที่รวบรวมไว้ มันต้องเป็น "crosscompiled" เพื่อความเข้ากันได้แบบย้อนหลัง หากต้องการกล่าวอีกวิธีหนึ่งจะมีความไม่ตรงกันระหว่างซอร์ส Java และเวอร์ชัน Java เป้าหมาย

การเปลี่ยนตัวเลือกในเมนู Eclipse จะไม่ตอบโปสเตอร์ต้นฉบับซึ่งบอกว่าเขา / เธอไม่ได้ใช้ Eclipse บน OpenJDK javac เวอร์ชัน 1.7 คุณสามารถข้ามคอมไพล์เป็น 1.6 ถ้าคุณใช้พารามิเตอร์-sourceและ-targetบวกให้rt.jar -file ของเวอร์ชันเป้าหมาย (นั่นคืออันที่เก่ากว่า) ในเวลารวบรวม หากคุณติดตั้ง 1.6 JRE คุณสามารถชี้ไปที่การติดตั้ง (ตัวอย่างเช่น /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar บน Ubuntu, / usr / jdk / jdk1 6.0_60 / jre / lib / rt.jar บน SunOS ขออภัยฉันไม่ทราบว่าอยู่บนระบบ Windows) ชอบมาก

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

10

ตามนี้ ...

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

ใน Eclipse คลิกขวาที่โครงการในแพ็คเกจ explorer:

เส้นทางการสร้าง -> กำหนดค่าเส้นทางการสร้าง

ภายใต้:

Java รูปร่างเส้นทาง -> ห้องสมุด -> เพิ่ม Library -> ระบบห้องสมุด JRE -> JREs ติดตั้ง -> ค้นหา

เพิ่ม JRE ที่ต้องการโดยการเลือกไลบรารีในรายการที่มีอยู่หลังจากการค้นหาเสร็จสมบูรณ์


10
  • หากคุณใช้ Maven ให้ตั้งค่าระดับการคอมไพล์ Java ของคุณ เปิดบรรทัดคำสั่งและเขียนjava -versionระดับการคอมไพล์ของคุณ:

    ป้อนคำอธิบายภาพที่นี่

  • ถ้าคุณใช้ความคิด IntelliJ เลือกโครงการ→ ไฟล์ → การตั้งค่า → การสร้างการดำเนินการปรับใช้ → คอมไพเลอร์ → Java คอมไพเลอร์ จากนั้นเปลี่ยนโค้ดไบต์เป็น 1.7 เช่นภาพนี้:

    ป้อนคำอธิบายภาพที่นี่


ฉันต้องทำการติดตั้ง Maven ให้สะอาดเช่นกันหลังจากเปลี่ยน pom
— Joe Borysko

10

หากคุณกำลังเผชิญปัญหานี้ในขณะที่ใช้Mavenคุณสามารถรวบรวมรหัสของคุณโดยใช้ plug-in 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>
       .....

UPDATE: ตั้งค่าsourceและtargetเป็น1.8หากคุณใช้ JDK 8


ตัวอย่างเกี่ยวกับวิธีการใช้ปลั๊กอินเพื่อข้ามคอมไพล์จะดีมากแทนที่จะไปที่ / เปิดลิงก์
— coding_idiot

8

ฉันมีข้อความแสดงข้อผิดพลาดเดียวกันเมื่อเรียกใช้ Ant จาก Eclipse แต่โซลูชันอื่น ๆ ที่กล่าวถึงในที่นี้ไม่สามารถแก้ปัญหาของฉันได้ สิ่งที่ตลกคือการใช้ Ant จากบรรทัดคำสั่งของ Windows ทำงานได้ดีดังนั้นจึงต้องมีปัญหาการกำหนดค่าภายใน Eclipse

ปรากฎว่าภายใต้ Eclipse คุณสามารถระบุสภาพแวดล้อมที่ Ant ควรจะทำงานด้วยและนี่ถูกตั้งค่าเป็น JRE แทนที่จะเป็น JDK

  • ไปที่: เรียกใช้ -> เครื่องมือภายนอก -> การกำหนดค่าเครื่องมือภายนอก ...
  • เลือก Ant build.xml สำหรับโครงการของคุณ (ถ้าคุณมีหลายโครงการ)
  • เปิดใช้งานแท็บ 'JRE'
  • ที่นี่เลือก 'คั่น ​​JRE: jre6' เมื่อฉันเปลี่ยนสิ่งนี้เป็น JDK จากซีรี่ส์ 1.6 หรือ 1.7 ข้อผิดพลาดก็หายไป

8

ฉันจะแก้ไขได้อย่างไร

ข้อผิดพลาดนี้หมายความว่า JRE ที่ใช้ในการเรียกใช้รหัสชั้นเรียนของคุณไม่รู้จักรุ่นของ Java ที่ใช้ โดยปกติแล้วเนื่องจากเวอร์ชันของ Java ที่สร้างไฟล์คลาสของคุณ (เช่นรวบรวมไว้) นั้นใหม่กว่า

หากต้องการแก้ไขคุณสามารถทำได้

a) คอมไพล์ซอร์ส Java ของคุณด้วยคอมไพเลอร์ Java เวอร์ชันเดียวกันหรือเก่ากว่าซึ่งจะถูกใช้เพื่อรัน เช่นติดตั้ง JDK ที่เหมาะสม

b) คอมไพล์ซอร์ส Java ของคุณด้วยคอมไพเลอร์ Java เวอร์ชันใหม่กว่า แต่อยู่ในโหมดความเข้ากันได้ เช่นใช้-targetพารามิเตอร์

c) รันคลาสที่คอมไพล์แล้วใน JRE ที่เหมือนกันหรือใหม่กว่าเวอร์ชั่นที่ JDK ใช้ในการคอมไพล์คลาส

คุณสามารถตรวจสอบเวอร์ชั่นที่คุณใช้กับ javac -versionคอมไพเลอร์และjava -versionรันไทม์

ฉันควรติดตั้ง JDK และตั้งค่าตัวแปร PATH ของฉันเป็น JDK แทนที่จะเป็น JRE หรือไม่

สำหรับการรวบรวมแน่นอนติดตั้งและกำหนดค่า JDK เฉพาะที่คุณต้องการ

สำหรับรันไทม์คุณสามารถใช้อันที่มาพร้อมกับ JDK หรือ JRE แบบสแตนด์อโลน แต่ไม่ว่าให้ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งเวอร์ชั่นที่ถูกต้องแล้ว

อะไรคือความแตกต่างระหว่างตัวแปร PATH ใน JRE หรือ JDK

ตัวแปรสภาพแวดล้อม PATH บอกเชลล์คำสั่งว่าจะค้นหาคำสั่งที่คุณพิมพ์ได้ที่ไหน เมื่อคุณพิมพ์javaตัวแปลคำสั่งเชลล์จะค้นหาตำแหน่งทั้งหมดที่ระบุในPATHตัวแปรจากซ้ายไปขวาเพื่อค้นหาjavaรันไทม์ที่เหมาะสมในการรัน หากคุณติดตั้ง Java หลายเวอร์ชัน - เช่นคุณมีjavaไฟล์สั่งการในหลายตำแหน่งที่ระบุไว้ในตัวแปร PATH ดังนั้นไฟล์แรกที่พบเมื่อไปจากซ้ายไปขวาจะเป็นไฟล์ที่ถูกเรียกใช้งาน

คำสั่งคอมไพเลอร์เป็นjavacและมาพร้อมกับ JDK เท่านั้น คำสั่งรันไทม์คือjavaและมาพร้อมกับ JDK และอยู่ใน JRE

อาจเป็นไปได้ว่าคุณมีรุ่นหนึ่ง (51.0 = Java 7) javacติดตั้งอยู่และคุณมีรุ่นเดียวกันกับที่javaติดตั้งอยู่ แต่รุ่นก่อนหน้าอีกรุ่นหนึ่งjavaปรากฏขึ้นก่อนหน้านี้ใน PATH และกำลังถูกเรียกใช้แทนรุ่นที่คุณคาดไว้ .


7

คุณได้ใช้รุ่นที่สูงขึ้นของ JDK เพื่อรวบรวมและพยายามที่จะเรียกใช้จากรุ่นล่างของ JDK / JRE

เพื่อตรวจสอบเรื่องนี้ดูข้อมูลรุ่น:

javac -version

java -version

พวกเขาจะแตกต่างกันและ javac จะมีหมายเลขรุ่นที่สูงกว่า

ในการหลีกเลี่ยงปัญหานี้ให้รันโดยใช้ java จากรุ่น JDK หรือหากคุณมี JRE / JDK ที่ใหม่กว่าที่สามารถใช้งานได้เช่นกัน

which javac/usr/bin/javacจะบอกคุณสถานที่ยกตัวอย่างเช่น /usr/bin/java <program>เพียงแค่เรียกใช้โดยตรงโดยใช้

หรือคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมเป็นโซลูชันถาวร


6

มีปัญหานี้เมื่อฉันเปลี่ยนกลับเป็น Java 6 และพยายามเรียกใช้คลาสที่รวบรวมด้วย Java 7 ก่อนหน้านี้สิ่งที่ได้ผลสำหรับฉันคือค่ากำหนด> java> compiler -> ตั้งค่าระดับความสอดคล้องเป็น 1.6 และ "กำหนดค่าการตั้งค่าโครงการ"


6

วันนี้ข้อความแสดงข้อผิดพลาดนี้ปรากฏในTomcat 7 ของเราบนUbuntu 12.04.2 LTS (Precise Pangolin):

/var/log/tomcat7/localhost.2014-04-08.log:
8 เม.ย. 2014 9:00:55 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: ข้อยกเว้นเริ่มต้นตัวกรอง struts2
java.lang.UnsupportedClassVersionError: ตัวควบคุม / ReqAccept: ไม่สนับสนุน major.minor รุ่น 51.0 (ไม่สามารถโหลดตัวควบคุมคลาสได้ ReqAccept)

Strutsแอพลิเคชันจะรวบรวมกับ Java 7

ปรากฏว่ามีผู้ใช้ "บริการ tomcat [stop / start]" เพื่อเริ่มต้น Tomcat 7 ใหม่

$ ps -ef | grep java
tomcat7 31783 1 32 20:13? 00:00:03 / usr / lib / jvm / default-java / bin / java ...
$ / usr / lib / jvm / default-java / bin / java
-version รุ่นjava "1.6.0_27"

ซึ่งทำให้เกิดข้อผิดพลาด "ไม่สนับสนุน major.minor รุ่น 51.0"

เมื่อเราใช้ "/etc/init.d/tomcat7 [stop / start]" เพื่อรีสตาร์ท Tomcat 7 ปัญหาได้รับการแก้ไขแล้ว

$ ps -ef | grep java
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 java version "1.7.0_15"


6

ฉันแก้ไขมันแล้ว ฉันวิ่ง:

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

ข้อผิดพลาดนั้นทำให้เข้าใจผิด, Unsupported major.minor version 51.0. สิ่งนี้ให้ความรู้สึกที่ไม่รองรับรุ่น 51 (Java 7) และเราควรใช้ Java 6

ข้อผิดพลาดควรเป็น:

ไม่รองรับ Java เวอร์ชันปัจจุบัน 50 ใช้ Java เวอร์ชัน 7 (51: 0 ขึ้นไป) แทน "


6

ไฟล์ Java ของคุณถูกคอมไพล์ด้วยเวอร์ชันอื่น (เวอร์ชันคอมไพเลอร์ที่สูงกว่า) กว่าเวอร์ชัน (เวอร์ชันรันไทม์ต่ำกว่า) ที่คุณพยายามรันด้วย

เป็นความเข้าใจพื้นฐานที่คลาสที่คอมไพล์ด้วยเวอร์ชันที่ต่ำกว่านั้นคาดว่าจะรันในเวอร์ชันที่สูงกว่าในภายหลัง แต่ตรงกันข้าม (คอมไพล์ด้วยคอมไพเลอร์เวอร์ชันสูงกว่าและพยายามรันด้วยเวอร์ชันรันไทม์ต่ำกว่า) บางครั้งก็เป็นไปไม่ได้

ดังนั้นคุณจะแสดงข้อผิดพลาดนี้เมื่อพยายามรันโปรแกรมของคุณ ไม่รองรับ major.minor เวอร์ชัน xx

ถาม:ฉันได้สร้างแอปพลิเคชั่นใน Java 7 แต่เมื่อผู้ใช้ของฉันพยายามเรียกใช้พวกเขาจะได้รับข้อผิดพลาดที่ไม่สนับสนุนรุ่น 51.0 สำคัญ นี่หมายถึงอะไรและฉันจะทำอย่างไรกับมัน?

ตอบ:หากคุณรวบรวมแอปพลิเคชั่นโดยใช้ javac ใน Java 7 คลาสไฟล์ที่ได้จะมีหมายเลขเวอร์ชั่น 51.0 เวอร์ชันของ Java ก่อนหน้า 7 ไม่รู้จักหมายเลขนี้ดังนั้นผู้ใช้ของคุณจะต้องอัปเกรดเป็น Java 7 ก่อนที่จะเรียกใช้แอปพลิเคชันของคุณ หากคุณไม่ได้ใช้ Java 7 API ใด ๆ คุณสามารถลองรวบรวมแอปพลิเคชันของคุณโดยใช้ javac -target 1.6 เพื่อสร้าง classfile ที่เข้ากันได้ 1.6 หากแอปพลิเคชันของคุณถูกปรับใช้โดยใช้ webstart คุณสามารถระบุเวอร์ชันขั้นต่ำที่ต้องการ สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารบน Java Web Start และ JNLP ที่นี่ ปัญหานี้จะหายไปเมื่อเราเรียกการอัปเดตอัตโนมัติไปยัง Java 7 สำหรับผู้ใช้ปลายทางที่มี Java 6 อยู่บนเดสก์ท็อป ระยะเวลาสำหรับสิ่งนี้ยังไม่ได้รับการพิจารณาเราต้องการให้นักพัฒนามีเวลาในการแก้ไขปัญหาใด ๆ ระหว่างโค้ดของพวกเขาและ JDK 7 ก่อน

(ที่มา: oracle.com .)


5

โอ้ Mac OS XI สามารถแก้ไขปัญหานี้ได้ด้วยการตั้งค่าตัวแปร JAVA_HOME:

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

4

ก่อนอื่นมาทำความเข้าใจให้ถูกต้องก่อน ...

JRE เป็นส่วนประกอบในNetBeans / Eclipse / สแตนด์อะโลนที่จะช่วยให้คุณมีห้องสมุด, JVM, ปลั๊กอิน Java และเว็บ Java เริ่มต้น โปรดทราบว่ามันไม่ได้ให้ตัวรวบรวมหรือดีบั๊ก

JDK เป็น superset ของ JRE พร้อมกับ compliers และ debuggers

ดังนั้นเมื่อคุณมีไลบรารีเริ่มต้นของคุณเป็น JRE แทนที่จะเป็น JDK คุณจะมีช่วงเวลาที่ดีในการนำเข้าข้อมูล แต่มันจะไม่รวบรวม

ให้ตั้งค่าพา ธ ของคุณเป็น JDK แทน (ฉันใช้ NetBeans และฉันตั้งมันโดยใช้ netbeans.conf ใน netbeans / etc / netbeans.conf และเปลี่ยนพา ธ )


3

ฉันมีปัญหาที่ฉันต้องเรียกใช้การรวบรวม Maven ในโครงการของฉันจากบรรทัดคำสั่งเพื่อเรียกใช้การทดสอบหน่วยของฉัน ถ้าฉันทำการเปลี่ยนแปลงคลาสการทดสอบและปล่อยให้ Eclipse ทำการคอมไพล์ใหม่โดยอัตโนมัติฉันได้รับข้อผิดพลาด "ไม่สนับสนุน major.minor รุ่น 51.0"

ฉันมีทั้ง JDK6 และ JDK7 ติดตั้ง แต่การตั้งค่า JRE ทั้งหมดของฉันชี้ไปที่ 1.6 ทั้งใน pom และจากหน้าคุณสมบัติโครงการใน Eclipse ไม่มีจำนวน Maven Update Project และ / หรือการรีเฟรชแก้ไขนี้

ในที่สุดฉันก็ลองปิดโปรเจ็กต์และเปิดใหม่อีกครั้งและสิ่งนี้ก็ดูเหมือนจะแก้ไขได้! HTH


3

คุณได้รวบรวมคลาส Java ของคุณด้วย JDK 7 และคุณพยายามเรียกใช้คลาสเดียวกันบน JDK 6


3
  • ติดตั้ง JDK 7.0.55 และตั้งค่า Java สำหรับEclipseสำหรับ JDK 7.0.55
  • สร้างโปรเจ็กต์ด้วย JDK 7.0.55 โดยการกำหนดค่าบนบิลด์พา ธ JDK 7.0.55
  • ตั้งคอมไพเลอร์ใน Eclipse สำหรับ JDK 7.0.55 โดยเมนูWindows -> Preferences -> Java -> Compiler - เลือก 1.7

3

คำตอบสำหรับปัญหา:

ข้อยกเว้นในเธรด "main" java.lang.UnsupportedClassVersionError: edu / stevens / cs549 / dhts / main / LocalContext: ไม่สนับสนุน major.minor รุ่น 52.0

ฉันมีปัญหาเดียวกัน สำหรับผู้ที่มีปัญหานี้ในอินสแตนซ์ของ AWS ec2 และได้ถูกเปลี่ยนเส้นทางที่นี่เพื่อคำถามนี้ ฉันกำลังตอบคำถามเหล่านั้นและต้องการแบ่งปันสิ่งที่ฉันทำ ฉันมีปัญหาเนื่องจากอินสแตนซ์ Amazon EC2 กำลังเรียกใช้จาวารุ่น 1.7 และอาจโครงการของฉันไม่สามารถใช้งานได้เนื่องจากฉันใช้ Maven และเป็นชนิดที่กำหนดค่าไว้ล่วงหน้าสำหรับ Java 1.8 ดังนั้นฉันจึงติดตั้ง java เวอร์ชันใหม่:

sudo yum -y install java-1.8.0

จากนั้นขั้นตอนสำคัญคือการลบเวอร์ชันที่เก่ากว่า:

sudo yum remove java-1.7.0-openjdk

อย่าลืมลบมันหลังจากติดตั้งเวอร์ชันใหม่มิฉะนั้นจะใช้เวอร์ชันเก่าอย่างต่อเนื่องและฉันหวังว่ามันจะช่วยแก้ปัญหาของคุณซึ่งทำในกรณีของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.