Comment corriger java.lang.UnsupportedClassVersionError: Version major.minor non prise en charge

J’essaie d’utiliser Notepad ++ comme outil tout-en-un pour éditer, exécuter, comstackr, etc.

J’ai JRE installé et j’ai configuré ma variable de chemin dans le répertoire … / bin.

Lorsque je lance mon “Hello world” dans Notepad ++, je reçois ce message:

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

Je pense que le problème concerne les versions; certaines versions de Java peuvent être anciennes ou trop récentes.

  1. Comment je le répare?
  2. Dois-je installer le JDK et configurer ma variable de chemin vers le JDK au lieu de JRE?
  3. Quelle est la différence entre la variable PATH dans JRE ou JDK?

Le numéro de version indiqué décrit la version du fichier JRE avec lequel le fichier de classe est compatible.

Les principaux nombres rapportés sont:

 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 

(Source: Wikipedia )

Pour résoudre le problème réel, vous devez essayer d’exécuter le code Java avec une version plus récente de Java JRE ou spécifier le paramètre cible au compilateur Java pour demander au compilateur de créer un code compatible avec les versions Java antérieures.

Par exemple, pour générer des fichiers de classe compatibles avec Java 1.4, utilisez la ligne de commande suivante:

 javac -target 1.4 HelloWorld.java 

Avec les nouvelles versions du compilateur Java, vous êtes probablement averti du fait que le chemin de la classe bootstrap n’est pas défini. Plus d’informations sur cette erreur sont disponibles dans l’article de blog Nouvel avertissement javac pour définir une ancienne source sans bootclasspath .

java.lang.UnsupportedClassVersionError se produit à cause d’un JDK plus élevé au moment de la compilation et d’un JDK inférieur pendant l’exécution.

Dans Eclipse, je suis simplement allé dans la commande de menu Fenêtre -> Préférences -> Java -> Compilateur , puis définissez “Niveau de conformité du compilateur” sur 1.6.

Ne vous inquiétez pas, je l’ai résolu.

C’est en fait simple – vous devez installer BOTH JRE / JDK avec la même version.

JRE 6 -> JDK 6

JRE 7 -> JDK 7

Etc.

Cette erreur signifie que vous essayez de charger un fichier Java “class” qui a été compilé avec une version plus récente de Java que celle que vous avez installée.

Par exemple, votre fichier .class pourrait avoir été compilé pour JDK 7 et vous essayez de l’exécuter avec JDK 6.

Donc, la solution consiste à:

  • Mettre à niveau votre runtime Java ou
  • Recomstackz la classe si vous en avez la source, en utilisant votre compilateur Java local (si vous en avez un).

    javac NomFichier.java

Pour les développeurs, cela peut se produire si un autre développeur vérifie un fichier .class, et qu’ils ont une version plus récente de Java que vous!

Vous essayez d’exécuter votre programme avec une version Java qui ne prend pas en charge la version dans laquelle le code a été compilé. Donc, fondamentalement, vous devez avoir compilé votre code avec une version supérieure et essayer de l’exécuter avec une version inférieure.

Comme vous obtenez

 Unsupported major.minor version 51.0 

et la version 51.0 correspond à J2SE 7, vous avez très probablement compilé votre code dans Java 7 et essayé de l’exécuter avec une version inférieure. Vérifiez ce que java -version affiche. Ce devrait être la version Java 7. Si ce n’est pas le cas, apportez les modifications appropriées dans PATH / JAVA_HOME. Ou vous pouvez comstackr avec la même version que vous essayez d’exécuter le code. Si les configurations prêtent à confusion, vous pouvez toujours /home/user/jdk1.7.0_11/bin/javac chemin absolu /home/user/jdk1.7.0_11/bin/javac et /home/user/jdk1.7.0_11/bin/java .

J’ai eu une situation similaire sur Mac, et le processus suivant a fonctionné pour moi:

Dans le terminal, tapez

 vi ~/.profile 

Puis ajoutez cette ligne dans le fichier et enregistrez

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

où la version est celle de votre ordinateur, telle que 1.7.0_25 .

Quittez l’éditeur, puis tapez la commande suivante pour la rendre effective

 source ~/.profile 

Puis tapez java -version pour vérifier le résultat

 java -version 

Qu’est-ce .profile fichier .profile ?

Le fichier .profile est un fichier caché. C’est un fichier optionnel qui indique au système les commandes à exécuter lorsque l’utilisateur dont le fichier de profil est connecté se connecte. Par exemple, si mon nom d’utilisateur est bruno et qu’il y a un fichier .profile dans / Users / bruno /, tout son contenu sera exécuté lors de la procédure de connexion.

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

Dans le menu Fenêtre Eclipse -> Préférences -> Java -> Compilateur, cochez également “Configurer les parameters spécifiques au projet”.

Si vous avez toujours l’erreur avec la même version de Java: essayez de supprimer manuellement le dossier de construction de votre projet. Puis redémarrez Eclipse.

Vous pouvez avoir une bibliothèque JAR compilée en Java 7 et vous avez uniquement Java 6 en tant que Java Runtime. Cela pourrait arriver avec de nouvelles bibliothèques.

Le problème le plus courant est la mauvaise configuration de votre variable JAVA_HOME , qui devrait pointer vers la bonne bibliothèque Java Development Kit, si vous en avez plusieurs.

Pour trouver l’emplacement du dossier Java SDK, exécutez les commandes suivantes:

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

Debian et Ubuntu

Pour vérifier quel Java (openjdk) vous avez installé, vérifiez via:

 dpkg -l "openjdk*" | grep ^i 

ou:

 update-java-alternatives -l 

Pour le changer, utilisez:

 update-alternatives --config java 

Préfixez avec sudo si nécessaire.

pour sélectionner la version java alternative.

Ou vérifiez qui sont disponibles pour l’installation:

 apt-cache search ^openjdk 

Préfixez avec sudo si nécessaire.

Ensuite, vous pouvez installer, par exemple:

 apt-get install openjdk-7-jre 

Préfixez avec sudo si nécessaire.

Fedora, Oracle Linux, Red Hat

Installer / mettre à jour le paquet approprié via:

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

Le package java-1.7.0-openjdk contient uniquement l’environnement d’exécution Java. Si vous souhaitez développer des programmes Java, installez le package java-1.7.0-openjdk-devel .

BSD

Il existe un paquet OpenJDK 7 dans la collection FreeBSD Ports appelé openjdk7 qui doit probablement être reconfiguré.

Voir: page wiki OpenJDK .

les fenêtres

Installez simplement la bibliothèque Java SE Development Kit appropriée à partir du site Oracle ou installez-la.

Jenkins

Si vous rencontrez ce problème avec Jenkins, consultez:

  • JENKINS-30561 – Impossible de lancer l’agent à l’aide de SSH

Cependant, la sélection de la bonne version de Java (plus récente) avec update-alternatives devrait fonctionner.

J’ai rencontré le même problème lorsque je travaillais avec un script Ant pour créer mon application.

J’utilise Eclipse pour le développement de mes applications et j’ai modifié la version du compilateur dans les propriétés de construction du projet. Mais ça n’a pas marché pour moi. Ensuite, j’ai découvert que je pouvais fournir la version du compilateur dans le script Ant.

J’ai modifié le script Ant dans la section où il comstack les fichiers Java.

     

Cela a fonctionné pour moi pour résoudre le problème mineur majeur non pris en charge.

Lorsque j’ai installé JDK 1.7, le problème a été résolu.

J’ai eu le même problème avec un projet écrit en 1.7 et j’ai essayé de l’exécuter en 1.6.

Ma solution dans Eclipse:

  • Faites un clic droit sur les propriétés de votre projet -> Java Build Path -> Libraries

  • Sélectionnez votre bibliothèque système JRE et cliquez sur Modifier à droite, puis sélectionnez l’environnement JRE cible.

  • Maintenant, allez à Java Comstackr sur la gauche et modifiez le niveau de conformité du compilateur à votre cible.

Cela a fonctionné pour moi.

Comme cela a été répondu ailleurs par plusieurs personnes, le programme Java est exécuté sur une version plus ancienne de Java que celle pour laquelle il a été compilé. Il doit être “recompilé” pour une compatibilité ascendante. En d’autres termes, il existe une incompatibilité entre les versions Java source et cible.

Changer les options dans les menus Eclipse ne répond pas à l’affiche originale, qui a déclaré qu’il n’utilisait pas Eclipse. Sur OpenJDK javac version 1.7, vous pouvez effectuer une compilation croisée pour 1.6 si vous utilisez les parameters -source et -target , ainsi que le fichier rt.jar de la version cible (c’est-à-dire la version antérieure) au moment de la compilation. Si vous installez réellement le JRE 1.6, vous pouvez pointer vers son installation (par exemple, /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar sur Ubuntu, / usr / jdk / jdk1. 6.0_60 / jre / lib / rt.jar apparemment sur SunOS Désolé, je ne sais pas où il se trouve sur un système Windows). Ainsi:

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

Il semble que vous puissiez simplement télécharger rt.jar depuis Internet et le pointer. Ce n’est pas trop élégant si:

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

Basé sur ceci…

 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 

Dans Eclipse, faites un clic droit sur le projet dans l’explorateur de paquets:

Chemin de génération -> Configurer le chemin de génération

En dessous de:

Chemin de génération Java -> Bibliothèques -> Ajouter une bibliothèque -> Bibliothèque système JRE -> JRE installés -> Rechercher .

Ajoutez le JRE requirejs en sélectionnant la bibliothèque dans la liste disponible une fois la recherche terminée.

  • Si vous utilisez Maven, définissez votre niveau de compilation Java. Ouvrez une ligne de commande et écrivez java -version pour votre niveau de compilation:

    Entrez la description de l'image ici

  • Si vous utilisez IntelliJ IDEA, sélectionnez Projet → FichierParamètresDéployer le déploiement de l’exécutionCompilateurCompilateur Java . Puis changez le code d’octet en 1.7 comme cette image:

    Entrez la description de l'image ici

J’ai eu le même message d’erreur lors de l’exécution d’Ant à partir d’Eclipse, mais les autres solutions mentionnées ici n’ont pas résolu mon problème. La chose amusante était que l’exécution d’Ant à partir de la ligne de commande Windows fonctionnait correctement, donc cela devait être un problème de configuration dans Eclipse.

Il s’est avéré que sous Eclipse, vous pouvez spécifier l’environnement avec lequel Ant devrait être exécuté, et cela a été défini comme JRE au lieu d’un JDK.

  • Aller à: Exécuter -> Outils externes -> Configurations d’outils externes …
  • Sélectionnez le fichier build.xml Ant pour votre projet (si vous avez plusieurs projets)
  • Activer l’onglet ‘JRE’
  • Ici a été sélectionné ‘Separate JRE: jre6’. Lorsque j’ai changé cela en JDK de la série 1.6 ou 1.7, l’erreur a disparu.

Comment je le répare?

Cette erreur signifie que le JRE utilisé pour exécuter votre code de classe ne reconnaît pas la version de Java utilisée. Habituellement, la version de Java qui a généré votre fichier de classe (c’est-à-dire compilé) est plus récente.

Pour y remédier, vous pouvez soit

a) Comstackz vos sources Java avec la même version, ou plus ancienne, du compilateur Java que vous utiliserez pour l’exécuter. c’est-à-dire installer le JDK approprié.

b) Comstackz vos sources Java avec la nouvelle version du compilateur Java, mais en mode de compatibilité. c’est à dire utiliser le paramètre -target .

c) Exécutez vos classes compilées dans un JRE identique ou plus récent que le JDK utilisé pour comstackr les classes.

Vous pouvez vérifier les versions que vous utilisez actuellement avec javac -version pour le compilateur et java -version pour le runtime.

Dois-je installer le JDK et configurer ma variable PATH sur le JDK au lieu de JRE?

Pour la compilation, certainement, installez et configurez le JDK spécifique que vous souhaitez.

Pour l’exécution, vous pouvez utiliser celui fourni avec le JDK ou un JRE autonome, mais assurez-vous néanmoins que vous avez installé les bonnes versions et configuré votre PATH de manière à ce qu’il n’y ait pas de surprise.

Quelle est la différence entre la variable PATH dans JRE ou JDK?

La variable d’environnement PATH indique au shell de commande où rechercher la commande que vous tapez. Lorsque vous tapez java , l’interpréteur de commandes examine tous les emplacements spécifiés dans la variable PATH , de gauche à droite, pour trouver l’exécutable d’exécution java approprié à exécuter. Si plusieurs versions de Java sont installées, c’est-à-dire que l’exécutable java spécifié dans la variable PATH à plusieurs endroits, le premier exécuté lorsque vous passez de gauche à droite sera celui exécuté.

La commande du compilateur est javac et n’est fournie qu’avec le JDK. La commande d’exécution est java et est fournie avec le JDK et se trouve dans le JRE.

Il est probable que vous ayez une version (51.0 = Java 7) de javac installée et que la même version de java installée, mais qu’une autre version précédente de java apparaît plus tôt dans le PATH et qu’elle est donc invoquée à la place de java celui que vous attendez.

Si vous rencontrez ce problème lors de l’utilisation de Maven , vous pouvez comstackr votre code à l’aide du compilateur Maven .

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

UPDATE: définissez la source et la target sur 1.8 , si vous utilisez JDK 8.

Vous avez utilisé une version supérieure du JDK pour comstackr et essayer d’exécuter à partir d’une version inférieure de JDK / JRE .

Pour vérifier cela, voir les informations de version:

 javac -version java -version 

Ils seront différents et javac aura un numéro de version plus élevé.

Pour contourner ce problème, utilisez java à partir de la version JDK ou si vous avez un JRE / JDK plus récent qui fonctionnera également.

which javac vous indiquera l’emplacement, par exemple /usr/bin/javac . Il suffit de lancer directement en utilisant /usr/bin/java .

OU vous pouvez définir la variable d’environnement comme solution permanente.

A eu ce problème lorsque je suis revenu à Java 6 et j’ai essayé de lancer des classes précédemment compilées avec Java 7. Ce qui a fonctionné pour moi était Preferences> java> comstackr -> définir le niveau de conformité à 1.6 et surtout “configurer les parameters du projet”.

Aujourd’hui, ce message d’erreur est apparu dans notre Tomcat 7 sur Ubuntu 12.04.2 LTS (Precise Pangolin):

/var/log/tomcat7/localhost.2014-04-08.log:
8 avril 2014 9:00:55 org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception commençant le filtre struts2
java.lang.UnsupportedClassVersionError: controller / ReqAccept: major.minor version 51.0 non pris en charge (impossible de charger le contrôleur de classe.ReqAccept)

L’application Struts est compilée avec Java 7.

Il s’est avéré que quelqu’un utilise “service tomcat [stop / start]” pour redémarrer 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
version java “1.6.0_27”

Ce qui provoque l’erreur “major.minor version 51.0” non pris en charge.

Lorsque nous avons utilisé “/etc/init.d/tomcat7 [stop / start]” pour redémarrer Tomcat 7, le problème a été résolu.

$ 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
version java “1.7.0_15”

Votre fichier Java est compilé avec une version différente (version du compilateur supérieure) que la version (version d’exécution inférieure) avec laquelle vous essayez de l’exécuter.

Il est fondamental de comprendre que les classes compilées avec des versions inférieures sont censées s’exécuter dans les versions ultérieures supérieures. Mais l’inverse (compilé avec une version de compilateur plus élevée et essayant de l’exécuter avec une version d’exécution plus basse) n’est parfois pas possible.

Par conséquent, cette erreur s’affiche lorsque vous essayez d’exécuter votre programme. Version major.minor non prise en charge xx

Q: J’ai créé une application en Java 7, mais lorsque mes utilisateurs essaient de l’exécuter, ils obtiennent une erreur majeure non prise en charge de major.minor version 51.0. Qu’est-ce que cela signifie et que puis-je faire à ce sujet?

R: Si vous comstackz une application utilisant javac dans Java 7, les classfiles obtenus auront le numéro de version 51.0. Les versions de Java antérieures à 7 ne reconnaissent pas ce numéro, vos utilisateurs devront donc passer à Java 7 avant d’exécuter votre application. Si vous n’utilisez aucune API Java 7, vous pouvez essayer de comstackr votre application en utilisant javac -target 1.6 pour créer un fichier de classe compatible 1.6. Si votre application est déployée à l’aide de Webstart, vous pouvez spécifier la version minimale requirejse. Pour plus d’informations, consultez les documents sur Java Web Start et JNLP ici. Ce problème disparaîtra lorsque nous déclencherons la mise à jour automatique sur Java 7 pour les utilisateurs finaux disposant actuellement de Java 6 sur leurs postes de travail. Le calendrier n’est pas encore déterminé, nous voulons donner aux développeurs le temps de résoudre les problèmes entre leur code et JDK 7 en premier.

(Source: oracle.com .)

Je l’ai résolu. Iran:

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

L’erreur est trompeuse, Unsupported major.minor version 51.0 . Cela donne l’impression que la version 51 (Java 7) n’est pas prise en charge. Et nous devrions utiliser Java 6.

L’erreur aurait dû être:

La version Java actuelle, 50, n’est pas prise en charge. Utilisez plutôt Java version 7 (51: 0 et supérieur).

Oh Mac OS XI a pu résoudre ce problème en définissant la variable JAVA_HOME:

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

D’abord, commençons par les bases …

JRE est un composant de NetBeans / Eclipse / standalone qui vous fournira des bibliothèques, des JVM, des plugins Java et un démarrage Web Java. Notez qu’il ne fournit pas de correcteurs ou de débogueurs.

JDK est le sur-ensemble de JRE avec les complieurs et les débogueurs.

Donc, quand vous avez votre bibliothèque par défaut en tant que JRE au lieu de JDK, vous allez avoir un bon moment pour importer des choses, mais cela ne comstackra pas.

Au lieu de cela, définissez votre chemin vers JDK (j’utilise NetBeans, et je les configure en utilisant netbeans.conf dans netbeans / etc / netbeans.conf et changez le chemin).

J’ai eu le problème de devoir exécuter une compilation Maven sur mon projet à partir de la ligne de commande pour exécuter mes tests unitaires; Si j’ai modifié la classe de test et que Eclipse l’a automatiquement recompilée, j’ai reçu l’erreur “Major.minor version 51.0” non prise en charge.

JDK6 et JDK7 ont tous deux été installés, mais tous mes parameters JRE indiquaient 1.6, à la fois dans la page des propriétés du projet et dans celle d’Eclipse. Aucune quantité de projet de mise à jour de Maven et / ou de rafraîchissement n’a résolu ce problème.

Finalement, j’ai essayé de fermer le projet et de le rouvrir, et cela semblait régler le problème! HTH

Vous avez compilé votre classe Java avec JDK 7 et vous essayez d’exécuter la même classe sur JDK 6.

  • Installez JDK 7.0.55 et définissez Java pour Eclipse pour JDK 7.0.55.
  • Générez le projet avec JDK 7.0.55 en le configurant sur le chemin de génération JDK 7.0.55.
  • Définissez le compilateur dans Eclipse pour JDK 7.0.55 via le menu Windows -> Préférences -> Java -> Compilateur – choisissez 1.7.

Dans mon cas, le problème était dans la configuration du serveur d’exécution:

Environnement d'exécution du serveur

Vérifiez que JRE est la version dont vous avez besoin:

entrer la description de l'image ici

Le projet était dans la version 1.7 et le serveur JRE était défini sur 1.6, après avoir changé pour la version java appropriée, il a été lancé correctement.