Déterminer la version de Java d’un fichier .class

class_file_icon.png

L'objet de ce billet est de découvrir des moyens pour déterminer avec quelle version de Java un fichier .class a été compilé.

Connaître la version de java avec laquelle une classe a été compilée peut s'avérer utile.
Par exemple, aujourd'hui, j'ai rencontré, au démarrage de mon serveur, une 'UnsupportedClassVersionError' car j'ai utilisé, sans le savoir, une classe compilée en Java 1.7 dans du code compilé dans une version inférieure.
En utilisant une des techniques ci-dessous, j'ai pu découvrir la version de la classe fautive.

Je vais donc vous montrer, à travers ce billet, trois moyens de savoir avec quelle version de java, un fichier .class a été compilé :

  • à l'aide d'un éditeur hexadécimal ;
  • à l'aide de "javap" ;
  • à l'aide de la commande Linux "file".

Table de correspondance des versions

versions_jdk.PNG

Cette table permet de faire la correspondance entre le couple (version majeure, version mineure) et la version du JDK.
Ainsi la version 50.0 correspond à Java SE 6.

Déterminer la version de java utilisée lors de la compilation

A l'aide d'un éditeur hexadécimal

Ouvrir un fichier .class à l'aide d'un éditeur hexadécimal :

hexa_class.png

Les 4 premiers octets (CA FE BA BE) correspondent au magic number. Cela indique à la JVM qu'il s'agit d'un fichier Java compilé.

Les 4 suivants définissent la version de Java utilisée lors de la compilation du fichier :

  • les 2 premiers (00 00) correspondent à la version mineure ;
  • les 2 suivants (00 33) à la version majeure.

Ces valeurs étant en hexadecimal, il faut donc les convertir en base décimale : la version mineure vaut alors 0 et la version majeure 51 (3*16 + 3).

Si nous nous référons à la table de correspondance précédente, nous en déduisons que notre classe a été compilée en Java 7.

A l'aide de 'javap'

javap est un outil permettant d'analyser le contenu d'un fichier .class. Il est livré avec le JDK.
Pour obtenir la version de MaClasse, nous utiliserons l'option "verbose". Cette option étant verbeuse (d'où le nom), nous filtrerons la sortie avec 'grep' (sous Linux) et 'find' (sous Windows).

Sous Linux

L'instruction suivante permet de déterminer la version mineure et la version majeure de java de MaClasse.class :

$ javap -verbose MaClasse | grep version

ce qui retourne :

minor version: 0
major version: 46

MaClasse a donc été compilée avec la version 1.2 de Java.

Sous Windows

L'instruction suivante permet de déterminer les version mineure et la version majeure de java de MaClasse.class :

> javap -verbose MaClasse | find "version"
Notez la présence obligatoire de double quotes pour l'utilisation de la commande 'find'.

ce qui retourne :

minor version: 0
major version: 46

MaClasse a donc été compilée avec la version 1.2 de Java.

A l'aide de la commande 'file' (sous Linux)

La commande 'file', de Linux, permet de déterminer le type d'un fichier.
L'instruction suivante permet de connaître la version de java de MaClasse.class :

$ file MaClasse.class

ce qui retourne :

MaClasse.class: compiled Java class data, version 46.0

MaClasse a donc été compilée avec la version 1.2 de Java.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.