java.lang.UnsupportedClassVersionError: numero di versione errato nel file .class?


140

Ricevo questo errore quando includo una libreria opensource che ho dovuto compilare dal sorgente. Ora, tutti i suggerimenti sul web indicano che il codice è stato compilato in una versione ed eseguito in un'altra versione (nuova su vecchia). Tuttavia, ho solo una versione di JRE sul mio sistema. Se eseguo i comandi:

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

e controlla in Eclipse le proprietà della libreria java, ho capito 1.5.0_18

Pertanto, devo concludere qualcos'altro, interno alla stessa classe, sta gettando l'eccezione ?? È anche possibile?


2
hai una versione compilata della libreria da qualche altra parte che potrebbe essere prima sul tuo percorso di classe?
Jeff Storey,

Buona idea, ma no. Ho fatto un controllo usando 'trova. -name '* .jar' | xargs individuare 'dalla cartella lib con i JAR. Inoltre, non pensavo che Eclipse usasse CLASSPATH? Altri buoni suggerimenti?
grmn.bob

come usare questo comando find -name '* .jar' su cmd mentre sto cercando di ricostruire nuovamente il codice jre src ... e per questo ho bisogno di lanciare questo cmd ..... javalobby.org/java/forums /t103334.html.....my jdk è in C: \ Programmi \ Java \ jdk1.6.0_31
Studente

Risposte:


185

Ho imparato che i messaggi di errore come questo di solito sono giusti. Quando non può POSSIBILMENTE (nella tua mente) essere ciò che dice l'errore riportato, vai a cercare un problema in un'altra area ... solo per scoprire dopo ore che il messaggio di errore originale era davvero giusto.

Dato che stai usando Eclipse, penso che Thilo abbia ragione. Il motivo più probabile per cui stai ricevendo questo messaggio è perché uno dei tuoi progetti sta compilando 1.6 classi. Non importa se sul sistema è presente solo un JRE 1.5, poiché Eclipse ha un proprio compilatore (non javac) e necessita solo di un JRE 1.5 per compilare 1.6 classi. Potrebbe essere strano e un'impostazione deve essere deselezionata per consentirlo, ma sono riuscito a farlo.

Per il progetto in questione, controlla le proprietà del progetto (di solito Alt + Invio), sezione Compilatore Java. Ecco un'immagine di un progetto configurato per compilare 1.6, ma con solo 1.5 JRE.

inserisci qui la descrizione dell'immagine


Totalmente d'accordo ... è per questo che ho posto, nel mio commento, la domanda sui modi per individuare. Non conoscevo le classi interne di Eclipse. La libreria è stata compilata sulla riga di comando con "javac" e integrata nel mio progetto Eclipse. Proverò a compilare il mio progetto dalla riga di comando. Hai chiaramente risolto questo problema in passato e i tuoi suggerimenti sono fantastici.
grmn.bob

3
Se hai il JDK (che ha i sorgenti), dovresti essere in grado di aggiungere alcuni punti di interruzione in Eclipse e speriamo di vedere quale classe sta tentando di caricare. Il modo più semplice è probabilmente un punto di interruzione nel costruttore per UnsupportedClassVersionError (o un punto di interruzione Eclipse Exception, l'icona 'J!'), Quindi puoi controllare come è arrivato lì.
Joshua McKinnon,

OK. Ho trovato un esperto nell'edificio ed è stato in grado di indirizzare Eclipse sullo stesso JRE della mia riga di comando. Ho quindi ricostruito contro 1.6 e ho corso contro 1.6 ed è tutto funzionante. Ovviamente, ho sbagliato a non avere altro che 1.5. Mi ha mostrato dove cercare. Grazie per l'aiuto - ora sono al mio prossimo problema! :)
grmn.bob

2
Ho avuto lo stesso problema. L'errore che ho fatto è stato l'utilizzo del compilatore 1.5 JRE e 1.6. Che non ha risolto l'errore di conversione non supportato. Quindi ho installato 1.6 JRE nella mia eclissi e ho usato il compilatore 1.6. Quindi tutto ha iniziato a funzionare bene.
Vanchinathan Chandrasekaran,

1
Voglio votare questo una seconda volta, perché è la seconda volta che ho avuto il problema, cercato, trovato questa risposta ed è stato giusto. > _ <
AlbeyAmakiir

9

Hai provato a fare un "clean" completo e poi ricostruire in Eclipse (Progetto-> Clean ...)?

Sei in grado di compilare ed eseguire con "javac" e "java" direttamente dalla riga di comando? Funziona correttamente?

Se fai clic con il pulsante destro del mouse sul tuo progetto, vai su "Proprietà" e poi su "Percorso build Java", ci sono voci sospette sotto una delle schede? Questo è essenzialmente il tuo CLASSPATH.

Nelle preferenze di Eclipse, potresti anche voler ricontrollare la sezione "JRE installati" nella sezione "Java" e assicurarti che corrisponda a quello che pensi che dovrebbe.

Hai sicuramente un file .class stantio che si trova da qualche parte o stai ricevendo una discrepanza di compilazione / runtime nelle versioni di Java che stai utilizzando.


sì (completamente pulito); non l'ho provato (progetto dalla linea cmd); forse / no (ho rimosso le voci da Eclipse "Java Build Path"); fatto questo (JREs - è qui che ho ottenuto la versione #).
grmn.bob

5

Hai compilato con Eclipse? Utilizza un compilatore diverso (non javac). Ciò non dovrebbe comportare questo errore (se tutto è configurato correttamente), ma puoi provare a compilarlo con javac.

Se ciò ha risolto il problema, prova a vedere se Eclipse ha alcune impostazioni del compilatore errate. In particolare hanno come target Java 5.


Questo è quello che sto imparando. Proverò a costruire i due pezzi allo stesso modo (cmd line e / o eclipse).
grmn.bob

1
Grazie Thilo, ho imparato molto oggi su Eclipse e Java e le versioni di classe. E anche un po 'di formica .
grmn.bob

2

Ho anche avuto lo stesso errore. Per questo motivo stavo compilando il progetto usando Maven. Avevo JAVA_HOME che indicava JDK7 e quindi java 1.7 veniva utilizzato per la compilazione e durante l'esecuzione del progetto utilizzavo JDK1.5. La modifica della voce seguente nel file .classpath o la modifica nell'eclissi come nella schermata hanno risolto il problema.

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

o modifica nella configurazione configuarions di eclipse come inserisci qui la descrizione dell'immagine


1

Controlla anche i file jar nel tuo progetto che sono stati compilati per una versione successiva di Java. Se queste sono le tue librerie, puoi risolverlo modificando l'attributo della versione di destinazione in javac

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

0

Un altro scenario in cui ciò potrebbe accadere è quando si avvia un'istanza di eclissi (per il debug, ecc.) Da un'eclissi di host - nel qual caso, modificare il livello del progetto o la libreria JRE sul solo percorso di classe del progetto non aiuta. Ciò che conta è il JRE utilizzato per avviare l'ambiente di eclissi di destinazione.


0

Controlla sempre anche l'ovvio. Ho ricevuto questo errore una volta quando ho accidentalmente preso la risorsa sbagliata per l'azione di aggiunta e rimozione del server. Può essere facile trascurare.


0

Anche la cancellazione dei file delle impostazioni specifiche del progetto (area di lavoro Eclipse / cartella del progetto / .settings /) dalla cartella del progetto farà altrettanto. Ovviamente, dobbiamo eliminare e compilare un progetto dopo averlo eliminato.


0

cambiando il progetto per usare java 1.7: Per farlo funzionare, segui questi passaggi:

  • Modifica livello di conformità del compilatore
  • Cambia i tuoi progetti JRE / JDK a qualcosa dello stesso livello (1.7 nel mio caso)
  • Fai la stessa modifica in tutti i progetti a cui fa riferimento il tuo progetto
  • Modifica la configurazione di esecuzione / debug per utilizzare JRE / JDK (o dello stesso livello)

Non funziona?

  • elimina la cartella Bin dei progetti
  • Pulito
  • ricostruire

Continua a non funzionare?

nella directory del tuo progetto: modifica .settings / org.eclipse.jdt.core.prefs> assicurati che il tuo livello target sia applicato

In bocca al lupo!


0

ho risolto questo problema cambiando jre richiesto per il server (nel mio caso è Tomcat). Dalla scheda Server in eclipse, fai doppio clic sul server (per aprire la pagina per la configurazione del server), fai clic su Runtime environment, quindi modifica JRE richiesto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.