Java 1.8 ASM ClassReader không thể phân tích cú pháp tệp lớp - có thể do phiên bản tệp lớp Java mới chưa được hỗ trợ


87

Ứng dụng web của tôi chạy tốt trên JDK 1.7 nhưng bị lỗi trên 1.8 với ngoại lệ sau (trong khi khởi động máy chủ ứng dụng với Jetty 8). Tôi đang sử dụng phiên bản Spring: 3.2.5.RELEASE.

Ngoại lệ:

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

Tôi giả sử rằng sự cố xảy ra do thư viện spring và "asm.jar" mà nó phụ thuộc vào.

Làm cách nào để giải quyết vấn đề này?


Bạn đang biên dịch ứng dụng web của mình dưới dạng Java 8 hoặc Java 7? Nếu 8, chúng ta có thể để biên dịch các lớp học của bạn nhắm mục tiêu Java 7 nhưng vẫn chạy nó dưới Java 8.
prunge

3
Nếu bạn muốn nhắm mục tiêu Java8 bạn sẽ cần mùa xuân 4
Pablo Lozano

Nó biên dịch thành 1.7 nhưng không hỗ trợ các tính năng của java 8. Vì vậy, sử dụng jdk 8 trong trường hợp này doesen't làm sence
stanislav.chetvertkov

Câu trả lời:


119

Như @prunge và @Pablo Lozano đã nêu, bạn cần Spring 4 nếu muốn biên dịch mã sang Java 8 (--target 1.8), nhưng bạn vẫn có thể chạy các ứng dụng trên Java 8 được biên dịch sang Java 7 nếu bạn chạy trên Spring 3.2.X.

Xem http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.0.html

Lưu ý rằng mức bytecode của Java 8 (-target 1.8, theo yêu cầu của -source 1.8) chỉ được hỗ trợ đầy đủ kể từ Spring Framework 4.0. Đặc biệt, các ứng dụng dựa trên Spring 3.2 cần được biên dịch với tối đa Java 7 làm mục tiêu, ngay cả khi chúng được triển khai trong thời gian chạy Java 8. Vui lòng nâng cấp lên Spring 4 cho các ứng dụng dựa trên Java 8.


Nó hoạt động, cảm ơn! Vì một số lý do, tôi đã bỏ lỡ bản phát hành mùa xuân 4 :-)
stanislav.chetvertkov.

2
Điều này cũng xảy ra với tôi, mặc dù mã vẫn được biên dịch thành mục tiêu 1.7, tôi chỉ thay đổi thời gian chạy thành java 8. Có ý kiến ​​nào không?
orrsella

1
Xem câu trả lời ItayK, có là một lỗi trong mùa xuân 3.2.8 và dưới đó sẽ không sử dụng phiên bản asm phải, nó cố định trong 3.2.9-
chrismarx

2
Có một lỗi khác đã được sửa trong 3.2.10, vì vậy tôi khuyên bạn nên sử dụng 3.2.16 hoặc bất kỳ phiên bản mới nhất nào. Dưới đây là các lỗi chính của Spring đã được khắc phục: Đọc siêu dữ liệu không bao giờ được sử dụng ASM cho java. * Và javax. * Loại (đặc biệt trên JDK 8) Java 8: Khách truy cập ASM5 được yêu cầu để phân tích cú pháp INVOKESPECIAL / STATIC trên giao diện
michaelok

Cảm ơn, nó đã hoạt động bằng cách giữ <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.7 </source> <target> 1.7 </ target> </configuration> thay vì <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.8 </source> <target> 1.8 < / target> </configuration>
Ashutosh S

67

Nếu bạn gặp phải lỗi này ngay cả khi bạn biên dịch với -target 1.7, xin lưu ý rằng đây là do lỗi trong Spring Framework khiến trình đọc lớp ASM tải các lớp jdk (java. * Hoặc javax. *), Tất nhiên là được biên dịch với -target 1.8.

Điều này, kết hợp với phiên bản ASM cũ trong mùa xuân 3.2.8 trở xuống, không hỗ trợ phân tích cú pháp các tệp lớp 1.8, cũng có thể dẫn đến lỗi này.

Bạn có thể tìm thêm thông tin về sự cố tại đây: https://jira.spring.io/browse/SPR-11719

Điều này sẽ được khắc phục trong Spring Framework phiên bản 3.2.9, sắp được phát hành.

Tất nhiên, nâng cấp lên Spring Framework 4 cũng sẽ giải quyết được vấn đề, vì nó đã chứa phiên bản ASM mới hơn.

Tuy nhiên, nếu vì lý do nào đó mà bạn chưa thể nâng cấp lên phiên bản 4, thì bạn nên biết sẽ có một giải pháp thay thế (sớm).


6
Nâng cấp lên Spring 3.2.9 đã giúp tôi.
Cengiz

2
Điều này sẽ là câu trả lời chấp nhận bởi vì nó giải thích rõ ràng những gì vấn đề là
Willa

2
Đã gặp sự cố này với Spring 3.2.5, được thay đổi thành 3.2.9 và sự cố đã được giải quyết. Câu trả lời hoàn hảo.
Salvatorelab

Phù, rất vui vì tôi không cần phải nâng cấp lên Spring 4. Câu trả lời tuyệt vời!
rudolfson

0

Nếu bạn sử dụng java 8 hoặc phiên bản tiếp theo, bạn cần nâng cấp phiên bản mùa xuân và phiên bản mùa xuân phải là 4.xxx


0

Tôi đã có cùng một vấn đề và đã giải quyết nó. Tôi đang sử dụng spring 3.x với java 8. Nếu các giải pháp trên không hoạt động, hãy thay đổi các bình và tìm kiếm xem các bình đó có tương thích với phiên bản java bạn đang sử dụng hay không. Spring 3.x không tương thích với java 8.


0

Spring 4 có thể được sử dụng cho java 8 để giải quyết vấn đề này. Tôi vừa thử nghiệm nó và nó hoạt động. Sự cố này đã được khắc phục kể từ phiên bản Spring 3.2.9-RELEASE.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.