java.lang.UnsupportedClassVersionError: Zły numer wersji w pliku .class?

140

Otrzymuję ten błąd, kiedy dołączam bibliotekę open source, którą musiałem skompilować ze źródła. Teraz wszystkie sugestie w sieci wskazują, że kod został skompilowany w jednej wersji i wykonany w innej (nowej na starej). Jednak mam tylko jedną wersję środowiska JRE w moim systemie. Jeśli uruchomię polecenia:

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

i sprawdź w Eclipse właściwości biblioteki java 1.5.0_18

Dlatego muszę podsumować coś innego, wewnętrznego dla samej klasy, rzuca wyjątek? Czy to w ogóle możliwe?

grmn.bob
źródło
2
czy masz skompilowaną wersję biblioteki gdzieś indziej, która może być najpierw na ścieżce klas?
Jeff Storey,
Dobry pomysł, ale nie. Sprawdziłem, używając polecenia „znajdź. -name '* .jar' | xargs locate 'z folderu lib z plikami JAR. Poza tym nie sądziłem, że Eclipse używa CLASSPATH? Jakieś inne dobre sugestie?
grmn.bob
jak używać tego polecenia find -name '* .jar' w cmd, ponieważ chcę ponownie zbudować kod jre src ... iw tym celu muszę uruchomić to cmd ..... javalobby.org/java/forums /t103334.html.....my jdk znajduje się w C: \ Program Files \ Java \ jdk1.6.0_31
Learner

Odpowiedzi:

185

Nauczyłem się, że takie komunikaty o błędach są zwykle prawidłowe. Kiedy MOŻLIWE (Twoim zdaniem) nie może być to, co mówi zgłaszany błąd, udajesz się na poszukiwanie problemu w innym obszarze ... tylko po to, aby dowiedzieć się kilka godzin później, że pierwotny komunikat o błędzie był rzeczywiście poprawny.

Ponieważ używasz Eclipse, myślę, że Thilo ma rację. Najbardziej prawdopodobnym powodem, dla którego otrzymujesz ten komunikat, jest to, że jeden z Twoich projektów kompiluje klasy 1.6. Nie ma znaczenia, czy masz w systemie tylko 1.5 JRE, ponieważ Eclipse ma swój własny kompilator (nie javac) i potrzebuje tylko 1.5 JRE do skompilowania klas 1.6. Może to być dziwne, a ustawienie musi być odznaczone, aby to umożliwić, ale po prostu udało mi się to zrobić.

W przypadku danego projektu sprawdź właściwości projektu (zwykle Alt + Enter), sekcja Kompilator Java. Oto obraz projektu skonfigurowanego do kompilacji 1.6, ale tylko z 1.5 JRE.

wprowadź opis obrazu tutaj

Joshua McKinnon
źródło
Całkowicie się zgadzam ... dlatego zadałem w swoim komentarzu pytanie o sposoby precyzyjnego wskazania. Nie wiedziałem o wewnętrznych klasach Eclipse. Biblioteka została skompilowana w wierszu poleceń za pomocą „javac” i zintegrowana z moim projektem Eclipse. Spróbuję skompilować projekt z wiersza poleceń. Wyraźnie rozwiązałeś ten problem w przeszłości, a Twoje sugestie są fantastyczne.
grmn.bob
3
Jeśli masz JDK (który ma źródła), powinieneś być w stanie dodać kilka punktów przerwania w Eclipse i miejmy nadzieję, że zobaczysz, jaką klasę próbuje załadować. Najłatwiejszym sposobem jest prawdopodobnie punkt przerwania w konstruktorze dla UnsupportedClassVersionError (lub punkt przerwania Eclipse Exception, ikona „J!”), A następnie możesz sprawdzić, jak się tam dostał.
Joshua McKinnon
DOBRZE. Znalazłem eksperta w tym budynku i był w stanie wskazać Eclipse to samo środowisko JRE, w którym działa moja linia poleceń. Potem przebudowałem na 1.6 i pobiegłem z 1.6 i wszystko działa. Oczywiście myliłem się, nie mając nic poza 1.5. Pokazał mi, gdzie mam szukać. Dzięki za pomoc - teraz przechodzę do kolejnego problemu! :)
grmn.bob
2
Miałem ten sam problem. Błąd, który popełniłem, polegał na tym, że używałem kompilatora 1.5 JRE i 1.6. Co nie rozwiązało problemu z nieobsługiwaną wersją klasy. Więc zainstalowałem JRE 1.6 w moim eclipse i użyłem kompilatora 1.6. Wtedy wszystko zaczęło działać dobrze.
Vanchinathan Chandrasekaran
1
Chcę zagłosować za tym drugim razem, ponieważ to już drugi raz, kiedy miałem problem, szukałem, znalazłem tę odpowiedź i było dobrze. > _ <
AlbeyAmakiir
9

Czy próbowałeś wykonać pełne „czyszczenie”, a następnie przebudować w Eclipse (Projekt-> Wyczyść ...)?

Czy jesteś w stanie skompilować i uruchomić z "javac" i "java" bezpośrednio z wiersza poleceń? Czy to działa poprawnie?

Jeśli klikniesz prawym przyciskiem myszy projekt, przejdź do „Właściwości”, a następnie do „Ścieżki budowania Java”, czy są jakieś podejrzane wpisy na którejkolwiek z zakładek? Zasadniczo jest to Twoja ścieżka CLASSPATH.

W preferencjach Eclipse możesz również dokładnie sprawdzić sekcję „Zainstalowane środowiska JRE” w sekcji „Java” i upewnić się, że jest zgodna z tym, co powinna.

Zdecydowanie masz gdzieś nieaktualny plik .class lub otrzymujesz niezgodność czasu kompilacji / czasu wykonywania w wersjach Java, których używasz.

Brent pisze kod
źródło
tak (pełne czyszczenie); nie próbowałem tego (projekt z linii cmd); może / nie (usunąłem wpisy z Eclipse „Java Build Path”); zrobiłem to (JREs - tam dostałem wersję #).
grmn.bob
5

Czy skompilowałeś z Eclipse? Używa innego kompilatora (nie javac). To nie powinno powodować tego błędu (jeśli wszystko jest poprawnie skonfigurowane), ale możesz spróbować skompilować go za pomocą javac.

Jeśli to rozwiązało problem, spróbuj sprawdzić, czy Eclipse ma jakieś nieprawidłowe ustawienia kompilatora. W szczególności celuj w Javę 5.

Thilo
źródło
Tego się uczę. Spróbuję zbudować te dwa elementy w ten sam sposób (linia cmd i / lub zaćmienie).
grmn.bob
1
Dzięki Thilo, wiele się dzisiaj nauczyłem o Eclipse, Javie i wersjach klas. I trochę o mrówkach .
grmn.bob
2

Mam też ten sam błąd. Powód, dla którego kompilowałem projekt przy użyciu Mavena. Miałem JAVA_HOME wskazujące na JDK7 i dlatego java 1.7 była używana do kompilacji, a podczas uruchamiania projektu korzystałem z JDK1.5. Zmiana poniższego wpisu w pliku .classpath lub zmiana zaćmienia jak na zrzucie ekranu rozwiązała problem.

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

lub zmień konfiguracje uruchamiania eclipse jako wprowadź opis obrazu tutaj

Vikky
źródło
1

Sprawdź również wszystkie pliki jar w projekcie, które zostały skompilowane dla wyższej wersji języka Java. Jeśli są to Twoje własne biblioteki, możesz to naprawić, zmieniając atrybut wersji docelowej na javac

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">
Jeshurun
źródło
0

Innym scenariuszem, w którym może się to zdarzyć, jest uruchomienie wystąpienia zaćmienia (w celu debugowania itp.) Z zaćmienia hosta - w takim przypadku zmiana poziomu projektu lub biblioteki JRE na samej ścieżce klas projektu nie pomaga. Liczy się środowisko JRE używane do uruchamiania docelowego środowiska zaćmienia.

Sójka
źródło
0

Zawsze sprawdzaj też oczywiste. Wystąpił ten błąd raz, gdy przypadkowo złapałem niewłaściwy zasób dla akcji dodawania i usuwania serwera. Łatwo można to przeoczyć.

Jamesa Drinkarda
źródło
0

Usunięcie plików ustawień specyficznych dla projektu (obszar roboczy Eclipse / folder projektu / .settings /) z folderu projektu również wystarczy. Oczywiście musimy wyczyścić projekt i skompilować go po usunięciu.

user3471219
źródło
0

zmiana projektu na java 1.7: Aby to działało, wykonaj następujące kroki:

  • Zmień poziom zgodności kompilatora
  • Zmień swoje projekty JRE / JDK na coś na tym samym poziomie (w moim przypadku 1.7)
  • Wprowadź tę samą zmianę we wszystkich projektach, do których odwołuje się Twój projekt
  • Zmień konfigurację uruchamiania / debugowania, aby używać środowiska JRE / JDK (lub tego samego poziomu)

Nie działa?

  • usuń katalog projektów Bin
  • Czysty
  • odbudować

Wciąż nie działa?

w katalogu twojego projektu: edytuj .settings / org.eclipse.jdt.core.prefs> upewnij się, że twój poziom docelowy jest zastosowany

Powodzenia!

Li3ro
źródło
0

rozwiązałem ten problem, zmieniając jre wymagane dla serwera (w moim przypadku jest to tomcat). Na karcie Serwer w eclipse kliknij dwukrotnie serwer (aby otworzyć stronę konfiguracji serwera), kliknij Środowisko uruchomieniowe, a następnie zmień wymagane JRE

ocrampico
źródło