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

140

J'obtiens cette erreur lorsque j'inclus une bibliothèque open source que j'ai dû compiler à partir des sources. 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 (du nouveau sur l'ancien). Cependant, je n'ai qu'une seule version de JRE sur mon système. Si j'exécute 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érifie dans Eclipse les propriétés de la bibliothèque java, j'obtiens 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?

grmn.bob
la source
2
avez-vous une version compilée de la bibliothèque ailleurs qui pourrait être sur votre chemin de classe en premier?
Jeff Storey
Bonne idée, mais non. J'ai fait une vérification en utilisant 'find. -nom '* .jar' | xargs localise 'dans le dossier lib avec les JAR. De plus, je ne pensais pas qu'Eclipse utilisait CLASSPATH? D'autres bonnes suggestions?
grmn.bob
comment utiliser cette commande find -name '* .jar' sur cmd car je cherche à reconstruire à nouveau le code jre src ... et pour cela, j'ai besoin de déclencher cette cmd ..... javalobby.org/java/forums /t103334.html.....my jdk est à C: \ Program Files \ Java \ jdk1.6.0_31
Apprenant le

Réponses:

185

J'ai appris que les messages d'erreur comme celui-ci sont généralement corrects. Quand cela ne peut pas (dans votre esprit) être ce que l'erreur signalée indique, vous partez à la recherche d'un problème dans un autre domaine ... pour découvrir des heures plus tard que le message d'erreur d'origine était en effet correct.

Puisque vous utilisez Eclipse, je pense que Thilo a raison. La raison la plus probable pour laquelle vous recevez ce message est que l'un de vos projets compile des classes 1.6. Ce n'est pas grave si vous n'avez qu'un JRE 1.5 sur le système, car Eclipse a son propre compilateur (pas javac), et n'a besoin que d'un JRE 1.5 pour compiler les classes 1.6. Cela peut être bizarre, et un paramètre doit être décoché pour permettre cela, mais j'ai juste réussi à le faire.

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

entrez la description de l'image ici

Joshua McKinnon
la source
Tout à fait d'accord ... c'est pourquoi j'ai posé, dans mon commentaire, la question des moyens de cerner. Je ne connaissais pas les classes internes d'Eclipse. La bibliothèque a été compilée en ligne de commande avec 'javac' et intégrée à mon projet Eclipse. Je vais essayer de compiler mon projet à partir de la ligne de commande. Vous avez clairement résolu ce problème dans le passé et vos suggestions sont fantastiques.
grmn.bob
3
Si vous avez le JDK (qui a des sources), vous devriez pouvoir ajouter des points d'arrêt dans Eclipse et, espérons-le, voir quelle classe il tente de charger. Le moyen le plus simple est probablement un point d'arrêt dans le constructeur pour UnsupportedClassVersionError (ou un point d'arrêt d'exception Eclipse, l'icône 'J!'), Puis vous pouvez inspecter comment il y est arrivé.
Joshua McKinnon
D'ACCORD. J'ai trouvé un expert dans le bâtiment et il a pu pointer Eclipse vers le même JRE que ma ligne de commande. J'ai ensuite reconstruit contre 1.6 et couru contre 1.6 et tout fonctionne. De toute évidence, j'avais tort de ne rien avoir d'autre que 1,5. Il m'a montré où chercher. Merci pour l'aide - maintenant je passe à mon prochain problème! :)
grmn.bob
2
J'ai eu le même problème. L'erreur que j'ai faite était que j'utilisais 1.5 JRE et 1.6 compilateur. Ce qui n'a pas résolu l'erreur de version de classe non prise en charge. J'ai donc installé le 1.6 JRE dans mon eclipse et utilisé le compilateur 1.6. Ensuite, tout a commencé à bien fonctionner.
Vanchinathan Chandrasekaran
1
Je veux voter pour cette deuxième fois, car c'est la deuxième fois que j'ai le problème, que je cherche, que je trouve cette réponse, et que c'est vrai. > _ <
AlbeyAmakiir
9

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

Êtes-vous capable de compiler et d'exécuter avec "javac" et "java" directement à partir de la ligne de commande? Cela fonctionne-t-il correctement?

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

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

Vous avez certainement soit un fichier .class périmé traînant quelque part, soit vous obtenez une incompatibilité au moment de la compilation et de l'exécution dans les versions de Java que vous utilisez.

Brent écrit le code
la source
oui (nettoyage complet); ne l'ai pas essayé (projet de la ligne cmd); peut-être / non (j'ai supprimé les entrées d'Eclipse "Java Build Path"); fait cela (JRE - c'est là que j'ai eu la version #).
grmn.bob
5

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 essayer de le compiler avec javac à la place.

Si cela a résolu le problème, essayez de voir si Eclipse a des paramètres de compilateur incorrects. Spécifiez-le cibler Java 5.

Thilo
la source
C'est ce que j'apprends. Je vais essayer de construire les deux pièces de la même manière (ligne cmd et / ou éclipse).
grmn.bob
1
Merci Thilo, j'ai beaucoup appris aujourd'hui sur Eclipse et Java et les versions de classe. Et un peu sur la fourmi aussi.
grmn.bob
2

J'ai également eu la même erreur. Raison pour laquelle je compilais le projet en utilisant Maven. JAVA_HOME pointait vers JDK7 et java 1.7 était donc 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 de l'éclipse 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 de l'éclipse comme entrez la description de l'image ici

Vikky
la source
1

Vérifiez également tous les fichiers jar de votre projet qui ont été 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 de la version cible en javac

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

Un autre scénario dans lequel cela pourrait se produire est lorsque vous lancez une instance d'éclipse (pour le débogage, etc.) à partir d'une éclipse hôte - auquel cas, modifier le niveau du projet ou la bibliothèque JRE sur le chemin de classe du projet seul n'aide pas. Ce qui compte, c'est le JRE utilisé pour lancer l'environnement d'éclipse cible.

Geai
la source
0

Vérifiez toujours l'évidence aussi. J'ai eu cette erreur une fois lorsque j'ai accidentellement saisi la mauvaise ressource pour l'action d'ajout et de suppression du serveur. Cela peut être facile à oublier.

James Drinkard
la source
0

La suppression des fichiers de paramètres spécifiques au projet (espace de travail Eclipse / dossier de projet / .settings /) du dossier de projet fera également l'affaire. De toute évidence, nous devons nettoyer et construire un projet après la suppression.

utilisateur3471219
la source
0

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 en 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
  • Modifiez votre configuration d'exécution / débogage pour utiliser le JRE / JDK (ou du même niveau)

Ca ne fonctionne pas?

  • supprimer le répertoire Bin des projets
  • 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!

Li3ro
la source
0

J'ai résolu ce problème en changeant jre requis pour le serveur (dans mon cas, c'est tomcat). Depuis l'onglet Serveur dans eclipse, double-cliquez sur le serveur (afin d'ouvrir la page de configuration du serveur), cliquez sur Environnement d'exécution, puis changez JRE requis

ocrampico
la source