web-dev-qa-db-fra.com

java.lang.UnsupportedClassVersionError: Numéro de version incorrect dans le fichier .class?

Je reçois cette erreur lorsque j'inclus une bibliothèque opensource que j'ai dû compiler à partir de la source. Désormais, toutes les suggestions sur le Web indiquent que le code a été compilé dans une version et exécuté dans une autre version (nouvelle sur ancienne). Cependant, je n'ai qu'une seule version de JRE sur mon système. Si je lance les commandes:

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

et vérifier dans Eclipse pour les propriétés de la bibliothèque Java, je reçois 1.5.0_18

Par conséquent, je dois conclure que quelque chose d'autre, interne à une classe elle-même, lance l'exception ?? Est-ce que c'est possible?

139
grmn.bob

J'ai appris que les messages d'erreur de ce type sont généralement corrects. Quand il est impossible (dans votre esprit) d’être ce que l’erreur rapportée dit, vous partez à la recherche d’un problème dans une autre région ... seulement pour découvrir quelques heures plus tard que le message d’erreur initial était correct.

Puisque vous utilisez Eclipse, je pense que Thilo a raison. La raison la plus probable pour laquelle vous recevez ce message est qu’un de vos projets compile 1.6 classes. Peu importe que vous disposiez uniquement d'un JRE 1.5 sur le système, car Eclipse dispose de son propre compilateur (pas de javac) et nécessite uniquement un JRE 1.5 pour compiler des classes 1.6. Cela peut paraître étrange et il faut décocher un paramètre pour permettre cela, mais j’ai simplement réussi à le faire.

Pour le projet en question, vérifiez les propriétés du projet (généralement Alt + Entrée), section Compilateur Java. Voici une image d'un projet configuré pour compiler 1.6, mais avec seulement un JRE 1.5.

enter image description here

184
Joshua McKinnon

Avez-vous essayé de faire un "nettoyage" complet, puis de le reconstruire dans Eclipse (Projet-> Nettoyer ...)? 

Pouvez-vous compiler et exécuter avec "javac" et "Java" directement à partir de la ligne de commande? Est-ce que ça fonctionne correctement?

Si vous faites un clic droit sur votre projet, allez dans "Propriétés" puis dans "Chemin de construction Java", y a-t-il des entrées suspectes dans les onglets? Ceci est essentiellement votre CLASSPATH.

Dans les préférences Eclipse, vous pouvez également vérifier la section "JRE installés" de la section "Java" et vous assurer qu'elle correspond à ce que vous estimez devoir.

Vous avez certainement soit un fichier .class obsolète qui traîne quelque part, soit vous obtenez une incompatibilité lors de la compilation/exécution dans les versions de Java que vous utilisez.

9
Brent Writes Code

Avez-vous compilé avec Eclipse? Il utilise un compilateur différent (pas javac). Cela ne devrait pas entraîner cette erreur (si tout est configuré correctement), mais vous pouvez plutôt essayer de le compiler avec javac.

Si cela résout le problème, essayez de voir si Eclipse a des paramètres de compilateur incorrects. Plus précisément, ciblez Java 5.

5
Thilo

J'ai aussi la même erreur. La raison pour laquelle je compilais le projet en utilisant Maven. J'avais Java_HOME pointant vers JDK7 et par conséquent, Java 1.7 était utilisé pour la compilation et lors de l'exécution du projet, j'utilisais JDK1.5. La modification de l'entrée ci-dessous dans le fichier .classpath ou la modification dans Eclipse comme dans la capture d'écran a résolu le problème.

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

ou modifier les configurations d'exécution d'Eclipse en tant que  enter image description here

2
Vikky

Vérifiez également tous les fichiers jar de votre projet compilés pour une version supérieure de Java. S'il s'agit de vos propres bibliothèques, vous pouvez résoudre ce problème en modifiant l'attribut version cible en javac.

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

Toujours vérifier l'évidence aussi. J'ai eu cette erreur une fois quand j'ai accidentellement saisi la mauvaise ressource pour l'action d'ajout et de suppression du serveur. Il peut être facile à négliger.

0
James Drinkard

La suppression des fichiers de paramètres spécifiques au projet (espace de travail Eclipse/dossier de projet/.settings /) du dossier de projet s’effectue également. Évidemment, nous devons faire un projet propre et construire après la suppression.

0
user3471219

j'ai résolu ce problème en changeant jre requis pour le serveur (Tomcat dans mon cas) . Sous l'onglet Serveur dans Eclipse, double-cliquez sur le serveur (pour ouvrir la page de configuration du serveur), cliquez sur Environnement d'exécution, puis modifiez. JRE requis

0
ocrampico

changer le projet pour utiliser Java 1.7: Pour que cela fonctionne, procédez comme suit:

  • Modifier le niveau de conformité du compilateur
  • Changez vos projets JRE/JDK à quelque chose du même niveau (1,7 dans mon cas)
  • Faites le même changement dans tous les projets référencés par votre projet
  • Changez votre configuration run/debug pour utiliser le JRE/JDK (ou du même niveau)

Ne fonctionne pas? 

  • supprimer des projets répertoire bin
  • Nettoyer
  • reconstruire

Ne fonctionne toujours pas?

dans le répertoire de votre projet: éditez .settings/org.Eclipse.jdt.core.prefs> assurez-vous que votre niveau cible est appliqué

Bonne chance!

0
Li3ro

Cela peut également se produire lorsque vous lancez une instance d'Eclipse (pour le débogage, etc.) à partir d'un hôte Eclipse. Dans ce cas, il n'est pas utile de modifier le niveau du projet ou la bibliothèque JRE sur le chemin de classe du projet. Ce qui compte, c'est le JRE utilisé pour lancer l'environnement Eclipse cible.

0
Jay