วิธีแก้ไข 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.