java.lang.UnsupportedClassVersionError: Số phiên bản xấu trong tệp. class?


140

Tôi gặp lỗi này khi bao gồm một thư viện mã nguồn mở mà tôi phải biên dịch từ nguồn. Bây giờ, tất cả các đề xuất trên web chỉ ra rằng mã được biên dịch trong một phiên bản và được thực thi trong phiên bản khác (mới trên cũ). Tuy nhiên, tôi chỉ có một phiên bản JRE trên hệ thống của mình. Nếu tôi chạy các lệnh:

$ javac -version
javac 1.5.0_18

$ java -version
java version "1.5.0_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_18-b02)
Java HotSpot(TM) Server VM (build 1.5.0_18-b02, mixed mode)

và kiểm tra Eclipse để biết các thuộc tính của thư viện java, tôi nhận được 1.5.0_18

Vì vậy, tôi phải kết luận một cái gì đó khác, nội bộ cho một lớp học, là ném ngoại lệ ?? Điều đó thậm chí có thể?


2
bạn có một phiên bản biên dịch của thư viện ở một nơi nào khác có thể có trên đường dẫn lớp của bạn trước không?
Jeff Storey

Ý tưởng tốt, nhưng không. Tôi đã kiểm tra bằng cách sử dụng 'find. -name '* .jar' | xargs xác định vị trí 'từ thư mục lib với JAR. Ngoài ra, tôi không nghĩ rằng Eclipse đã sử dụng CLASSPATH? Bất kỳ đề nghị tốt khác?
grmn.bob

Làm thế nào để sử dụng lệnh find -name '* .jar' này trên cmd khi tôi đang tìm cách xây dựng lại mã jre src một lần nữa ... và vì thế tôi cần phải kích hoạt cmd này ..... javalulk.org/java/forums /t103334.html.....my jdk có tại C: \ Tệp chương trình \ Java \ jdk1.6.0_31
Người học

Câu trả lời:


185

Tôi đã học được rằng các thông báo lỗi như thế này thường là đúng. Khi nó không thể POSSIBLY (trong tâm trí của bạn) là những gì lỗi được báo cáo, bạn đi săn tìm một vấn đề ở một khu vực khác ... chỉ để tìm ra hàng giờ sau đó rằng thông báo lỗi ban đầu thực sự đúng.

Vì bạn đang sử dụng Eclipse, tôi nghĩ rằng Thilo có quyền. Lý do rất có thể bạn nhận được thông báo này là vì một trong các dự án của bạn đang biên dịch 1.6 lớp. Sẽ không có vấn đề gì nếu bạn chỉ có 1,5 JRE trên hệ thống, bởi vì Eclipse có trình biên dịch riêng (không phải javac) và chỉ cần 1,5 JRE để biên dịch 1.6 lớp. Nó có thể là lạ, và một thiết lập cần phải được bỏ chọn để cho phép điều này, nhưng tôi chỉ quản lý để làm điều đó.

Đối với dự án đang đề cập, hãy kiểm tra Thuộc tính dự án (thường là Alt + Enter), phần Trình biên dịch Java. Đây là hình ảnh của một dự án được cấu hình để biên dịch 1.6, nhưng chỉ với 1,5 JRE.

nhập mô tả hình ảnh ở đây


Hoàn toàn đồng ý ... đó là lý do tại sao tôi hỏi, trong nhận xét của tôi, câu hỏi cho các cách để xác định chính xác. Tôi không biết các lớp bên trong Eclipse. Thư viện được biên dịch trên dòng lệnh với 'javac' và được tích hợp vào dự án Eclipse của tôi. Tôi sẽ thử biên dịch dự án của tôi từ dòng lệnh. Bạn rõ ràng đã giải quyết vấn đề này trong quá khứ và đề xuất của bạn là tuyệt vời.
grmn.bob

3
Nếu bạn có JDK (có nguồn), bạn sẽ có thể thêm một số điểm dừng trong Eclipse và hy vọng xem lớp nào nó đang cố tải. Cách dễ nhất có lẽ là một điểm dừng trong hàm tạo cho UnsupportedClassVersionError (hoặc một điểm dừng ngoại lệ Eclipse, biểu tượng 'J!), Sau đó bạn có thể kiểm tra xem nó đã đến đó như thế nào.
Joshua McKinnon

ĐỒNG Ý. Tôi đã tìm thấy một chuyên gia trong tòa nhà và anh ta có thể chỉ ra Eclipse đến cùng JRE như dòng lệnh của tôi. Sau đó tôi xây dựng lại với 1.6 và chạy với 1.6 và tất cả đều hoạt động. Rõ ràng, tôi đã sai về việc không có gì ngoài 1.5. Anh chỉ cho tôi nơi cần tìm. Cảm ơn sự giúp đỡ - bây giờ tôi đang gặp vấn đề tiếp theo! :)
grmn.bob 18/03

2
Tôi gặp vấn đề tương tự. Lỗi tôi đã làm là tôi đã sử dụng trình biên dịch 1.5 JRE và 1.6. Mà không giải quyết được lỗi không được hỗ trợ. Vì vậy, tôi đã cài đặt 1.6 JRE trong nhật thực của mình và sử dụng trình biên dịch 1.6. Sau đó mọi thứ bắt đầu hoạt động tốt.
Vanchinathan Chandrasekaran

1
Tôi muốn nâng cấp điều này lần thứ hai, vì đó là lần thứ hai tôi gặp sự cố, tìm kiếm, tìm thấy câu trả lời này và nó đã đúng. > _ <
AlbeyAmakiir

9

Bạn đã thử thực hiện đầy đủ "sạch" và sau đó xây dựng lại trong Eclipse (Project-> Clean ...) chưa?

Bạn có thể biên dịch và chạy với "javac" và "java" trực tiếp từ dòng lệnh không? Điều đó có hoạt động đúng không?

Nếu bạn nhấp chuột phải vào dự án của bạn, đi đến "Thuộc tính" và sau đó chuyển đến "Đường dẫn xây dựng Java", có bất kỳ mục đáng ngờ nào trong bất kỳ tab nào không? Đây thực chất là CLASSPATH của bạn.

Trong các tùy chọn Eclipse, bạn cũng có thể muốn kiểm tra kỹ phần "JREs đã cài đặt" trong phần "Java" và đảm bảo nó phù hợp với những gì bạn nghĩ nó nên.

Bạn chắc chắn có một tệp. Class cũ nằm ở đâu đó hoặc bạn đang nhận được sự không khớp thời gian biên dịch / thời gian chạy trong các phiên bản Java bạn đang sử dụng.


có (sạch hoàn toàn); chưa thử nó (dự án từ dòng cmd); có thể / không (Tôi đã xóa các mục từ "Đường dẫn xây dựng Java" của Eclipse); đã làm điều đó (JREs - đó là nơi tôi có phiên bản #).
grmn.bob

5

Bạn đã biên dịch với Eclipse? Nó sử dụng một trình biên dịch khác nhau (không phải javac). Điều đó sẽ không dẫn đến lỗi này (nếu mọi thứ được cấu hình đúng), nhưng bạn có thể thử biên dịch nó bằng javac thay thế.

Nếu điều đó đã khắc phục được sự cố, hãy thử xem Eclipse có một số cài đặt trình biên dịch không chính xác không. Cụ thể có mục tiêu Java 5.


Đó là những gì tôi đang học. Tôi sẽ thử xây dựng hai mảnh theo cùng một cách (đường cmd và / hoặc nhật thực).
grmn.bob

1
Cảm ơn Thilo, hôm nay tôi đã học được rất nhiều về các phiên bản Eclipse và Java và lớp. Và một chút về kiến quá.
grmn.bob 18/03/2016

2

Tôi cũng nhận được lỗi tương tự. Lý do là tôi đã biên dịch dự án bằng Maven. Tôi đã có JAVA_HOME trỏ đến JDK7 và do đó java 1.7 đã được sử dụng để biên dịch và khi chạy dự án tôi đang sử dụng JDK1.5. Thay đổi mục dưới đây trong tệp. Classpath hoặc thay đổi nhật thực như trong ảnh chụp màn hình đã giải quyết vấn đề.

classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5

hoặc thay đổi cấu hình chạy của nhật thực như nhập mô tả hình ảnh ở đây


1

Đồng thời kiểm tra bất kỳ tệp jar nào trong dự án của bạn đã được biên dịch cho phiên bản Java cao hơn. Nếu đây là các thư viện của riêng bạn, bạn có thể khắc phục điều này bằng cách thay đổi thuộc tính phiên bản đích thành javac

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">

0

Một kịch bản khác có thể xảy ra là khi bạn khởi chạy một thể hiện của nhật thực (để gỡ lỗi, v.v.) từ nhật thực máy chủ - trong trường hợp đó, việc thay đổi cấp độ của dự án hoặc thư viện JRE trên đường dẫn lớp của dự án không giúp ích gì. Vấn đề là JRE được sử dụng để khởi động môi trường nhật thực mục tiêu.


0

Luôn luôn kiểm tra cho rõ ràng quá. Tôi đã gặp lỗi này một lần khi tôi vô tình lấy tài nguyên sai cho hành động thêm và xóa của máy chủ. Nó có thể dễ dàng bỏ qua.


0

Xóa các tệp cài đặt cụ thể của dự án (không gian làm việc Eclipse / thư mục dự án / .sinstall /) khỏi thư mục dự án cũng sẽ làm được. Rõ ràng, chúng ta cần làm sạch một dự án và xây dựng sau khi xóa.


0

thay đổi dự án để sử dụng java 1.7: Để làm việc này, hãy làm theo các bước sau:

  • Thay đổi cấp độ tuân thủ trình biên dịch
  • Thay đổi JRE / JDK dự án của bạn thành một cái gì đó cùng cấp (1.7 trong trường hợp của tôi)
  • Thực hiện cùng một thay đổi trong tất cả các dự án được tham chiếu bởi dự án của bạn
  • Thay đổi cấu hình chạy / gỡ lỗi của bạn để sử dụng JRE / JDK (hoặc cùng cấp)

Không làm việc?

  • xóa dự án thư mục Bin
  • Dọn dẹp
  • tái tạo

Vẫn không làm việc?

trong thư mục dự án của bạn: chỉnh sửa .sinstall / org.eclipse.jdt.core.prefs> đảm bảo mức mục tiêu của bạn được áp dụng

Chúc may mắn!


0

tôi đã giải quyết vấn đề này bằng cách thay đổi jre cần thiết cho máy chủ (trong trường hợp của tôi là tomcat). Từ tab Máy chủ trong nhật thực, nhấp đúp vào máy chủ (để mở trang cho cấu hình máy chủ), nhấp vào môi trường Thời gian chạy, sau đó thay đổi JRE cần thiết

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.