Java 1.8 ASM ClassReader ล้มเหลวในการแยกวิเคราะห์ไฟล์คลาส - อาจเป็นเพราะไฟล์คลาส Java เวอร์ชันใหม่ที่ยังไม่รองรับ


88

เว็บแอปพลิเคชันของฉันทำงานได้ดีบน JDK 1.7 แต่ขัดข้องบน 1.8 โดยมีข้อยกเว้นต่อไปนี้ (ระหว่างการเริ่มต้นแอ็พพลิเคชันเซิร์ฟเวอร์ด้วย Jetty 8) ฉันใช้ Spring version: 3.2.5.RELEASE

ข้อยกเว้น:

org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet

ฉันคิดว่าปัญหาเกิดขึ้นเนื่องจากสปริงและไลบรารี "asm.jar" ซึ่งขึ้นอยู่กับ

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


คุณกำลังรวบรวมเว็บแอปของคุณเป็น Java 8 หรือ Java 7 หรือไม่? ถ้า 8 คุณควรรวบรวมคลาสของคุณที่กำหนดเป้าหมาย Java 7 แต่ยังคงรันภายใต้ Java 8
prunge

3
หากคุณต้องการกำหนดเป้าหมาย Java8 คุณจะต้องใช้ Spring 4
Pablo Lozano

คอมไพล์เป็น 1.7 แต่ไม่มีการรองรับคุณสมบัติ java 8 ดังนั้นการใช้ jdk 8 ในกรณีนี้จึงไม่เกิดขึ้น
stanislav.chetvertkov

คำตอบ:


119

ตามที่ @prunge และ @Pablo Lozano ระบุไว้คุณต้องใช้ Spring 4 หากคุณต้องการคอมไพล์โค้ดเป็น Java 8 (- เป้าหมาย 1.8) แต่คุณยังสามารถเรียกใช้แอปบน Java 8 ที่คอมไพล์เป็น Java 7 ได้หากคุณรันบน Spring 3.2.X

ลองดู http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.0.html

โปรดทราบว่าระดับ bytecode ของ Java 8 (-target 1.8 ตามต้องการโดย -source 1.8) ได้รับการสนับสนุนอย่างสมบูรณ์ใน Spring Framework 4.0 เท่านั้น โดยเฉพาะอย่างยิ่งแอ็พพลิเคชันที่ใช้ Spring 3.2 จำเป็นต้องคอมไพล์โดยมี Java 7 สูงสุดเป็นเป้าหมายแม้ว่าจะมีการปรับใช้บนรันไทม์ Java 8 ก็ตาม โปรดอัปเกรดเป็น Spring 4 สำหรับแอปพลิเคชันที่ใช้ Java 8


ได้ผลขอบคุณ! ด้วยเหตุผลบางอย่างฉันพลาดรุ่น Spring 4 :-)
stanislav.chetvertkov

2
สิ่งนี้เกิดขึ้นกับฉันเช่นกันแม้ว่าโค้ดจะยังคงถูกคอมไพล์เพื่อกำหนดเป้าหมาย 1.7 แต่ฉันเปลี่ยนรันไทม์เป็น java 8 เท่านั้นมีความคิดอย่างไร
orrsella

2
ดูคำตอบของ ItayK มีข้อผิดพลาดในฤดูใบไม้ผลิ 3.2.8 และต่ำกว่าที่จะไม่ใช้เวอร์ชัน asm ที่ถูกต้องได้รับการแก้ไขใน 3.2.9-
chrismarx

2
มีการแก้ไขข้อบกพร่องอื่นใน 3.2.10 ดังนั้นฉันขอแนะนำให้ใช้ 3.2.16 หรืออะไรก็ตามที่เป็นรุ่นล่าสุด ต่อไปนี้คือจุดบกพร่องที่สำคัญของ Spring ที่ได้รับการแก้ไข: การอ่านข้อมูลเมตาไม่ควรใช้ ASM สำหรับประเภท java. * และ javax. * (โดยเฉพาะใน JDK 8) Java 8: ผู้เยี่ยมชม ASM5 ที่จำเป็นสำหรับการแยกวิเคราะห์ INVOKESPECIAL / STATIC บนอินเทอร์เฟซ
michaelok

ขอบคุณมันใช้งานได้โดยเก็บ <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.7 </source> <target> 1.7 </ target> </configuration> แทน <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.8 </source> <target> 1.8 < / target> </configuration>
Ashutosh S

67

หากคุณพบข้อผิดพลาดนี้แม้ว่าคุณจะคอมไพล์ด้วย -target 1.7 โปรดทราบว่านี่เป็นเพราะจุดบกพร่องใน Spring Framework ซึ่งทำให้ ASM classreader โหลดคลาส jdk (java. * หรือ javax. *) ซึ่งแน่นอนว่า คอมไพล์ด้วย -target 1.8

สิ่งนี้เมื่อรวมกับ ASM เวอร์ชันเก่าในฤดูใบไม้ผลิ 3.2.8 และต่ำกว่าซึ่งไม่รองรับการแยกวิเคราะห์ไฟล์คลาส 1.8 อาจทำให้เกิดข้อผิดพลาดนี้ได้

ดูข้อมูลเพิ่มเติมเกี่ยวกับปัญหาได้ที่นี่: https://jira.spring.io/browse/SPR-11719

สิ่งนี้ควรได้รับการแก้ไขใน Spring Framework เวอร์ชัน 3.2.9 ซึ่งมีกำหนดจะออกในเร็ว ๆ นี้

แน่นอนว่าการอัปเกรดเป็น Spring Framework 4 จะช่วยแก้ปัญหาได้เช่นกันเนื่องจากมี ASM เวอร์ชันที่ใหม่กว่าอยู่แล้ว

อย่างไรก็ตามหากด้วยเหตุผลบางประการคุณยังไม่สามารถอัปเกรดเป็นเวอร์ชัน 4 ได้ก็ควรทราบว่ามีทางเลือกอื่น (เร็ว ๆ นี้)


6
การอัปเกรดเป็น Spring 3.2.9 ช่วยฉันได้
Cengiz

2
นี่ควรเป็นคำตอบที่ยอมรับได้เพราะมันอธิบายได้ชัดเจนว่าปัญหาคืออะไร
Willa

2
มีปัญหานี้กับ Spring 3.2.5 เปลี่ยนเป็น 3.2.9 และแก้ไขปัญหาแล้ว คำตอบที่สมบูรณ์แบบ
Salvatorelab

ว้าวดีใจที่ไม่ต้องอัปเกรดเป็น Spring 4 คำตอบที่ดี!
rudolfson

0

หากคุณใช้ java 8 หรือเวอร์ชันถัดไปคุณต้องอัปเกรดเวอร์ชันสปริงและเวอร์ชันสปริงควรเป็น 4.xxx


0

ฉันมีปัญหาเดียวกันและแก้ไขได้ ฉันใช้ spring 3.x กับ java 8 หากวิธีแก้ปัญหาข้างต้นใช้งานไม่ได้ให้เปลี่ยน jars และค้นหาว่า jars เหล่านั้นเข้ากันได้กับ java เวอร์ชันที่คุณใช้หรือไม่ spring 3.x เข้ากันไม่ได้กับ java 8


0

Spring 4 สามารถใช้กับ java 8 เพื่อแก้ไขปัญหานี้ ฉันเพิ่งทดสอบและใช้งานได้ ปัญหานี้ได้รับการแก้ไขตั้งแต่เวอร์ชัน Spring 3.2.9-RELEASE

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