Come risolvere java.lang.UnsupportedClassVersionError: versione major.minor non supportata

Sto cercando di usare Notepad ++ come strumento di modifica, esecuzione, compilazione, ecc.

Ho installato JRE e ho impostato la variabile di percorso nella directory … / bin.

Quando eseguo il mio “Hello world” in Notepad ++, ottengo questo messaggio:

java.lang.UnsupportedClassVersionError: test_hello_world : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) ......................................... 

Penso che il problema qui sia relativo alle versioni; alcune versioni di Java potrebbero essere vecchie o troppo nuove.

  1. Come lo aggiusto?
  2. Dovrei installare JDK e impostare la mia variabile path su JDK anziché su JRE?
  3. Qual è la differenza tra la variabile PATH in JRE o JDK?

Il numero di versione mostrato descrive la versione di JRE con cui il file di class è compatibile.

I principali numeri riportati sono:

 Java SE 10 = 54, Java SE 9 = 53, Java SE 8 = 52, Java SE 7 = 51, Java SE 6.0 = 50, Java SE 5.0 = 49, JDK 1.4 = 48, JDK 1.3 = 47, JDK 1.2 = 46, JDK 1.1 = 45 

(Fonte: Wikipedia )

Per risolvere il problema, provare a eseguire il codice Java con una versione più recente di Java JRE o specificare il parametro di destinazione sul compilatore Java per indicare al compilatore di creare codice compatibile con le versioni precedenti di Java.

Ad esempio, per generare file di class compatibili con Java 1.4, utilizzare la seguente riga di comando:

 javac -target 1.4 HelloWorld.java 

Con le versioni più recenti del compilatore Java è probabile che venga visualizzato un avviso sul percorso della class bootstrap non impostato. Ulteriori informazioni su questo errore sono disponibili nel post del blog Nuovo avviso javac per l’impostazione di una fonte precedente senza bootclasspath .

java.lang.UnsupportedClassVersionError verifica a causa di un JDK superiore durante la compilazione e un JDK inferiore durante il runtime.

In Eclipse, sono appena passato al comando di menu Finestra -> Preferenze -> Java -> Compilatore e poi a “Livello di conformità del compilatore” a 1.6.

Non preoccuparti, l’ho risolto.

In realtà è semplice: è necessario installare BOTH JRE / JDK con la stessa versione.

JRE 6 -> JDK 6

JRE 7 -> JDK 7

E così via.

Questo errore significa che stai tentando di caricare un file “di class” Java compilato con una versione di Java più recente di quella che hai installato.

Ad esempio, il tuo file .class potrebbe essere stato compilato per JDK 7 e stai cercando di eseguirlo con JDK 6.

Quindi la soluzione è:

  • Aggiorna il tuo runtime Java o
  • Ricompila la class se hai il sorgente, usando il tuo compilatore Java locale (se ne hai uno).

    javac FileName.java

Per gli sviluppatori, questo può accadere se un altro sviluppatore controlla un file .class e ha una versione più recente di java di quella che hai!

Stai cercando di eseguire il tuo programma con una versione Java che non supporta la versione in cui è stato compilato il codice. Quindi in pratica devi aver compilato il tuo codice con una versione più alta e provare a eseguirlo usando una versione più bassa.

Come stai ricevendo

 Unsupported major.minor version 51.0 

e la versione 51.0 corrisponde a J2SE 7 , molto probabilmente hai compilato il tuo codice in Java 7 e provando ad eseguirlo usando una versione più bassa. Controlla cosa visualizza la java -version . Dovrebbe essere la versione di Java 7. In caso contrario, apportare le modifiche appropriate nel PERCORSO / JAVA_HOME. Oppure puoi compilare con la stessa versione che stai cercando di eseguire il codice. Se le configurazioni sono confuse puoi sempre dare il percorso assoluto /home/user/jdk1.7.0_11/bin/javac e /home/user/jdk1.7.0_11/bin/java .

Ho avuto una situazione simile su Mac e il seguente processo ha funzionato per me:

Nel terminale, digitare

 vi ~/.profile 

Quindi aggiungi questa linea nel file e salva

 export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk.jdk/Contents/Home 

dove versione è quella sul tuo computer, come 1.7.0_25 .

Esci dall’editor, quindi digita il seguente comando per renderlo effettivo

 source ~/.profile 

Quindi digitare java -version per verificare il risultato

 java -version 

Cos’è il file .profile ?

Il file .profile è un file nascosto. È un file facoltativo che dice al sistema quali comandi eseguire quando l’utente di cui il file di profilo è connesso. Ad esempio, se il mio nome utente è bruno e c’è un file .profile in / Users / bruno /, tutti i suoi contenuti verrà eseguito durante la procedura di accesso.

Fonte: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile–mac-30515

Nel menu di Eclipse, Finestra -> Preferenze -> Java -> Compilatore controlla anche “Configura impostazioni specifiche del progetto”.

Se hai l’errore con la stessa versione di Java: prova a eliminare manualmente la cartella di build del tuo progetto. Quindi riavviare Eclipse.

Puoi avere una libreria JAR compilata in Java 7 e hai solo Java 6 come Java Runtime. Potrebbe accadere con alcune nuove librerie.

Il problema più comune è l’errata configurazione della variabile JAVA_HOME che dovrebbe puntare alla corretta libreria Java Development Kit, se è stata installata più volte.

Per trovare dove si trova la cartella SDK Java, eseguire i seguenti comandi:

 jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));' 

Debian / Ubuntu

Per verificare quale java (openjdk) hai installato, controlla tramite:

 dpkg -l "openjdk*" | grep ^i 

o:

 update-java-alternatives -l 

Per cambiarlo, usa:

 update-alternatives --config java 

Prefisso con sudo se richiesto.

per selezionare la versione java alternativa.

Oppure controlla quali sono disponibili per l’installazione:

 apt-cache search ^openjdk 

Prefisso con sudo se richiesto.

Quindi è ansible installare, ad esempio:

 apt-get install openjdk-7-jre 

Prefisso con sudo se richiesto.

Fedora, Oracle Linux, Red Hat

Installa / aggiorna il pacchetto appropriato tramite:

 yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel 

Il pacchetto java-1.7.0-openjdk contiene solo Java Runtime Environment. Se si desidera sviluppare programmi Java, installare il pacchetto java-1.7.0-openjdk-devel .

BSD

C’è un pacchetto OpenJDK 7 nella raccolta di porte di FreeBSD chiamato openjdk7 che probabilmente deve essere riconfigurato.

Vedi: pagina wiki OpenJDK .

windows

È sufficiente installare la libreria del kit di sviluppo Java SE appropriata dal sito Oracle o installarla

Jenkins

Se riscontri questo problema con Jenkins, vedi:

  • JENKINS-30561 – Imansible avviare l’agente tramite SSH

Tuttavia, la scelta della giusta versione di Java (più recente) con update-alternatives dovrebbe funzionare.

Ho affrontato lo stesso problema quando stavo lavorando con uno script Ant per creare la mia applicazione.

Uso Eclipse per lo sviluppo della mia applicazione e ho modificato la versione del compilatore nelle proprietà di costruzione del progetto. Ma non ha funzionato per me. Poi ho scoperto che posso fornire la versione del compilatore nello script Ant.

Ho modificato lo script Ant nella sezione in cui compila i file Java.

     

Questo ha funzionato per risolvere il problema minore non supportato.

Quando ho installato JDK 1.7, il problema è stato risolto.

Ho avuto lo stesso problema con un progetto scritto in 1.7 e ho provato ad eseguire in 1.6.

La mia soluzione in Eclipse:

  • Fai clic con il tasto destro del mouse su Proprietà progetto -> Percorso build Java -> Librerie

  • Seleziona la tua libreria di sistema JRE e fai clic su Modifica a destra, quindi scegli il JRE di destinazione.

  • Ora vai su Java Compiler sulla sinistra e modifica il livello di conformità del compilatore sulla destinazione.

Questo ha funzionato per me.

Come risposto altrove da più persone, il programma Java viene eseguito su una versione precedente di Java rispetto a quella per cui è stato compilato. Deve essere “crosscompiled” per compatibilità con le versioni precedenti. Per dirla in altro modo, c’è una discrepanza tra le versioni Java di origine e di destinazione.

Le opzioni di modifica nei menu di Eclipse non rispondono al poster originale, che ha dichiarato di non utilizzare Eclipse. Su OpenJDK javac versione 1.7, è ansible eseguire crosscompile per 1.6 se si utilizzano i parametri -source e -target , oltre a fornire il file rt.jar della versione di destinazione (ovvero, il più vecchio) in fase di compilazione. Se si installa effettivamente JRE 1.6, è ansible puntare alla relativa installazione (ad esempio, /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar su Ubuntu, / usr / jdk / jdk1. 6.0_60 / jre / lib / rt.jar su SunOS apparentemente Spiacente, non so dove sia su un sistema Windows). Così:

 javac -source 1.6 -target 1.6 -bootclasspath /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar HelloWorld.java 

Sembra che tu possa semplicemente scaricare rt.jar da Internet e puntare ad esso. Questo non è troppo elegante però:

 javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java 

Basato su questo…

 J2SE 8 = 52 J2SE 7 = 51 J2SE 6.0 = 50 J2SE 5.0 = 49 JDK 1.4 = 48 JDK 1.3 = 47 JDK 1.2 = 46 JDK 1.1 = 45 

In Eclipse, fare clic con il tasto destro del mouse sul progetto in package explorer:

Build Path -> Configure Build Path

Sotto:

Percorso build Java -> Librerie -> Aggiungi libreria -> Libreria di sistema JRE -> JRE installati -> Cerca .

Aggiungere il JRE richiesto selezionando la libreria nell’elenco disponibile dopo aver completato la ricerca.

  • Se usi Maven, imposta il tuo livello di compilazione Java. Apri una riga di comando e scrivi java -version per il tuo livello di compilazione:

    Inserisci qui la descrizione dell'immagine

  • Se si utilizza IntelliJ IDEA, selezionare project → FileImpostazioniBuild Execution DeploymentCompilerJava Compiler . Quindi cambia il codice byte come 1.7 come questa immagine:

    Inserisci qui la descrizione dell'immagine

Ho avuto lo stesso messaggio di errore durante l’esecuzione di Ant da Eclipse, ma le altre soluzioni menzionate qui non risolvono il mio problema. La cosa divertente era che l’esecuzione di Ant dalla riga di comando di Windows stava funzionando bene, quindi doveva essere un problema di configurazione all’interno di Eclipse.

È emerso che in Eclipse è ansible specificare l’ambiente in cui Ant deve essere in esecuzione e questo è stato impostato come JRE anziché come JDK.

  • Vai a: Esegui -> Strumenti esterni -> Configurazioni strumenti esterni …
  • Seleziona Ant build.xml per il tuo progetto (se hai più progetti)
  • Attiva la scheda ‘JRE’
  • Qui è stato selezionato ‘Separate JRE: jre6’. Quando ho cambiato questo in un JDK della serie 1.6 o 1.7, l’errore era sparito.

Come lo aggiusto?

Questo errore indica che il JRE utilizzato per eseguire il codice class non riconosce la versione di Java utilizzata. Solitamente perché la versione di Java che ha generato il tuo file di class (cioè compilato) è più recente.

Per risolvere il problema, puoi o

a) Compilare le sorgenti Java con la stessa, o precedente versione del compilatore Java che verrà utilizzata per eseguirla. vale a dire installare il JDK appropriato.

b) Compilare le sorgenti Java con la versione più recente del compilatore Java ma in modalità di compatibilità. vale a dire utilizzare il parametro -target .

c) Esegui le classi compilate in un JRE che è la stessa, o più recente, versione del JDK utilizzato per compilare le classi.

Puoi controllare le versioni che stai usando con javac -version per il compilatore e java -version per il runtime.

Devo installare JDK e impostare la mia variabile PATH su JDK anziché su JRE?

Per la compilazione, certamente, installa e configura il JDK specifico che desideri.

Per il runtime, è ansible utilizzare quello fornito con JDK o JRE autonomo, ma a prescindere, assicurarsi di aver installato le versioni corrette e di aver configurato il PERCORSO in modo tale che non ci siano sorprese.

Qual è la differenza tra la variabile PATH in JRE o JDK?

La variabile d’ambiente PATH indica alla shell di comando dove cercare il comando che si digita. Quando si digita java , l’interprete della shell dei comandi esaminerà tutte le posizioni specificate nella variabile PATH , da sinistra a destra, per trovare l’eseguibile runtime java appropriato da eseguire. Se sono installate più versioni di Java, ovvero se si dispone dell’eseguibile java in più posizioni specificate nella variabile PATH, il primo che viene rilevato quando si passa da sinistra a destra sarà quello che viene eseguito.

Il comando del compilatore è javac e viene fornito solo con JDK. Il comando runtime è java e viene fornito con JDK e si trova in JRE.

È probabile che tu abbia una versione (51.0 = Java 7) di javac installata, e hai anche la stessa versione di java installata, ma che un’altra versione precedente di java appare in precedenza nel PATH e quindi viene invocata al posto del quello che ti aspetti

Se stai affrontando questo problema mentre usi Maven , puoi compilare il tuo codice compilando il plug-in Maven Compiler .

     org.apache.maven.plugins maven-compiler-plugin 3.1  1.6 1.6   ..... 

UPDATE: imposta source e target su 1.8 , se stai usando JDK 8.

Hai usato una versione più alta del JDK per compilare e provare a eseguire da una versione precedente di JDK / JRE .

Per verificare ciò, consultare le informazioni sulla versione:

 javac -version java -version 

Saranno diversi e javac avrà un numero di versione più alto.

Per aggirare questo problema, esegui usando java dalla versione JDK o se hai un JRE / JDK più recente che funzionerà pure.

which javac ti dirà la posizione, ad esempio, /usr/bin/javac . Basta eseguire direttamente usando /usr/bin/java .

OPPURE è ansible impostare la variabile di ambiente come soluzione permanente.

Ho avuto questo problema quando sono tornato a Java 6 e ho provato a eseguire le classi compilate in precedenza con Java 7. Ciò che ha funzionato per me era Preferenze> java> compiler -> imposta il livello di conformità a 1.6 e in modo cruciale “configura le impostazioni del progetto”.

Oggi, questo messaggio di errore è apparso nel nostro Tomcat 7 su Ubuntu 12.04.2 LTS (Precise Pangolin):

/var/log/tomcat7/localhost.2014-04-08.log:
8 aprile 2014 9:00:55 org.apache.catalina.core.StandardContext filterStart
SEVERE: eccezioni all’avviamento dei montanti del filtro2
java.lang.UnsupportedClassVersionError: controller / ReqAccept: non supportato major.minor versione 51.0 (imansible caricare il controller di class.ReqAccept)

L’applicazione Struts è compilata con Java 7.

Si è scoperto che qualcuno utilizza “service tomcat [stop / start]” per riavviare Tomcat 7,

$ ps -ef | grep java
tomcat7 31783 1 32 20:13? 00:00:03 / usr / lib / jvm / default-java / bin / java …
$ / usr / lib / jvm / default-java / bin / java -version
versione java “1.6.0_27”

Che causa l’errore “Non supportato major.minor versione 51.0”.

Quando abbiamo usato “/etc/init.d/tomcat7 [stop / start]” per riavviare Tomcat 7, il problema è stato risolto.

$ ps -ef | grep java
tomcat7 31886 1 80 20:24? 00:00:10 /usr/local/java/jdk1.7.0_15/bin/java
$ /usr/local/java/jdk1.7.0_15/bin/java -version
versione java “1.7.0_15”

Il tuo file Java è compilato con una versione diversa (versione del compilatore più alta) rispetto alla versione (versione runtime inferiore) con cui stai provando a eseguirla.

È fondamentale capire che le classi compilate con versioni inferiori dovrebbero funzionare nelle versioni successive successive. Ma il contrario (compilato con una versione più alta del compilatore e cercando di eseguirlo con una versione runtime inferiore) a volte non è ansible.

Quindi ti viene mostrato questo errore, quando cerchi di eseguire il tuo programma. Major.minor non supportato versione xx

D: Ho creato un’applicazione in Java 7, ma quando i miei utenti cercano di eseguirli ottengono un errore 51.0 di major.minor non supportato. Che cosa significa e cosa posso fare al riguardo?

A: Se si compila un’applicazione utilizzando javac in Java 7, i file class risultanti avranno il numero di versione 51.0. Le versioni di Java precedenti alla 7 non riconoscono questo numero, quindi gli utenti dovranno eseguire l’aggiornamento a Java 7 prima di eseguire l’applicazione. Se non si utilizzano API Java 7, è ansible provare a compilare la propria applicazione utilizzando javac -target 1.6 per creare un file di class compatibile con 1.6. Se la tua applicazione è distribuita usando webstart puoi specificare la versione minima richiesta. Per ulteriori informazioni, consultare qui i documenti su Java Web Start e JNLP. Questo problema scomparirà non appena avremo triggersto l’aggiornamento automatico a Java 7 per gli utenti finali che stanno attualmente utilizzando Java 6 sui loro desktop. La tempistica per questo non è ancora determinata, vogliamo dare agli sviluppatori il tempo di risolvere prima eventuali problemi tra il loro codice e JDK 7.

(Fonte: oracle.com .)

L’ho risolto. Ho corso:

 JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386 

L’errore è fuorviante, Unsupported major.minor version 51.0 . Ciò dà l’impressione che la versione 51 (Java 7) non sia supportata. E dovremmo usare Java 6.

L’errore avrebbe dovuto essere:

L’attuale versione Java, 50, non è supportata. Utilizzare Java versione 7 (51: 0 e versioni successive) invece

Oh Mac OS XI è stato in grado di risolvere questo problema impostando la variabile JAVA_HOME:

 export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home 

Per prima cosa prendiamo alcune nozioni di base …

JRE è un componente di NetBeans / Eclipse / standalone che fornirà librerie, JVM, plug-in Java e Java Web Start. Si noti che non fornisce compilatori o debugger.

JDK è il superset di JRE insieme a compilatori e debugger.

Quindi, quando hai la tua libreria predefinita come JRE invece di JDK, ti divertirai ad importare cose, ma non verrà compilata.

Invece, imposta il tuo percorso su JDK (io uso NetBeans e li imposto usando netbeans.conf in netbeans / etc / netbeans.conf e cambio il percorso).

Ho avuto il problema per cui dovevo eseguire una compilation Maven sul mio progetto dalla riga di comando per eseguire i miei test unitari; se ho apportato una modifica alla class di test e ho lasciato ricompilare automaticamente Eclipse, ho ricevuto l’errore “Non supportato major.minor versione 51.0”.

Ho installato sia JDK6 che JDK7, ma tutte le mie impostazioni JRE puntavano a 1.6, sia nel pom che nella pagina delle proprietà del progetto in Eclipse. Nessuna quantità di Maven Update Project e / o aggiornamento ha risolto questo problema.

Alla fine ho provato a chiudere il progetto e riaprirlo, e questo sembrava risolverlo! HTH

Hai compilato la tua class Java con JDK 7 e stai provando a eseguire la stessa class su JDK 6.

  • Installa JDK 7.0.55 e imposta Java per Eclipse per JDK 7.0.55.
  • Costruire il progetto con JDK 7.0.55 configurando sul percorso di compilazione JDK 7.0.55.
  • Imposta il compilatore in Eclipse per JDK 7.0.55 dal menu Windows -> Preferenze -> Java -> Compilatore – scegli 1.7.

Nel mio caso il problema era nella configurazione del runtime del server:

Server Runtime Environment

Controlla che JRE sia la versione che ti serve:

inserisci la descrizione dell'immagine qui

Il progetto era in versione 1.7 e il server JRE è stato impostato come 1.6, dopo aver modificato la corretta versione di java ha lanciato bene.