Question

L'un d'entre vous connaît-il un outil qui recherchera les fichiers .class et affichera ensuite leurs versions compilées ?

Je sais que vous pouvez les consulter individuellement dans un éditeur hexadécimal, mais j'ai beaucoup de fichiers de classe à consulter (quelque chose dans mon application géante est en train de compiler en Java6 pour une raison quelconque).

Était-ce utile?

La solution

Utilisez le java outil fourni avec le JDK.Le -verbose L’option imprimera le numéro de version du fichier de classe.

> javap -verbose MyClass
Compiled from "MyClass.java"
public class MyClass
  SourceFile: "MyClass.java"
  minor version: 0
  major version: 46
...

Pour afficher uniquement la version :

WINDOWS> javap -verbose MyClass | find "version"
LINUX  > javap -verbose MyClass | grep version

Autres conseils

Il est assez facile de lire le signature du fichier de classe et obtenez ces valeurs sans API tierce.Tout ce que vous avez à faire est de lire les 8 premiers octets.

ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;

Pour le fichier de classe version 51.0 (Java 7), les octets d'ouverture sont :

CA FE BA BE 00 00 00 33

...où 0xCAFEBABE sont les octets magiques, 0x0000 est la version mineure et 0x0033 est la version majeure.

import java.io.*;

public class Demo {
  public static void main(String[] args) throws IOException {
    ClassLoader loader = Demo.class.getClassLoader();
    try (InputStream in = loader.getResourceAsStream("Demo.class");
        DataInputStream data = new DataInputStream(in)) {
      if (0xCAFEBABE != data.readInt()) {
        throw new IOException("invalid header");
      }
      int minor = data.readUnsignedShort();
      int major = data.readUnsignedShort();
      System.out.println(major + "." + minor);
    }
  }
}

Répertoires pédestres (Déposer) et les archives (FichierJar) la recherche de fichiers de classe est triviale.

d'Oracle Le blog de Joe Darcy énumère les version de classe vers les mappages de version JDK jusqu'à Java 7 :

Target   Major.minor Hex
1.1      45.3        0x2D
1.2      46.0        0x2E
1.3      47.0        0x2F
1.4      48.0        0x30
5 (1.5)  49.0        0x31
6 (1.6)  50.0        0x32
7 (1.7)  51.0        0x33
8 (1.8)  52.0        0x34
9        53.0        0x35

Sur un modèle Unix

file /path/to/Thing.class

Donnera également le type et la version du fichier.Voici à quoi ressemble le résultat :

données de classe Java compilées, version 49.0

Si vous êtes sur un système Unix, vous pouvez simplement faire un

find /target-folder -name \*.class | xargs file | grep "version 50\.0"

(ma version du fichier indique "données de classe Java compilées, version 50.0" pour les classes Java6).

Encore une autre vérification de la version Java

od -t d -j 7 -N 1 ApplicationContextProvider.class | head -1 | awk '{print "Java", $2 - 44}'

Dans Eclipse si vous n'avez pas de sources jointes.Faites attention à la première ligne après le bouton Joindre la source.

// Compilé à partir de CDestinoLog.java (version 1.5 :49,0, super peu)

enter image description here

Peut-être que cela aide quelqu'un aussi.Il semble qu'il existe un moyen plus simple d'obtenir la version JAVA utilisée pour compiler/construire .class.Cette méthode est utile pour l'auto-vérification de l'application/classe sur la version JAVA.

J'ai parcouru la bibliothèque JDK et trouvé cette constante utile :com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION.Je ne sais pas depuis quand c'est dans JAVA JDK.

En essayant ce morceau de code pour plusieurs constantes de version, j'obtiens le résultat ci-dessous :

src :

System.out.println("JAVA DEV       ver.: " + com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION);
System.out.println("JAVA RUN     v. X.Y: " + System.getProperty("java.specification.version") );
System.out.println("JAVA RUN v. W.X.Y.Z: " + com.sun.deploy.config.Config.getJavaVersion() ); //_javaVersionProperty
System.out.println("JAVA RUN  full ver.: " + System.getProperty("java.runtime.version")  + " (may return unknown)" );
System.out.println("JAVA RUN       type: " + com.sun.deploy.config.Config.getJavaRuntimeNameProperty() );

sortir:

JAVA DEV       ver.: 1.8.0_77
JAVA RUN     v. X.Y: 1.8
JAVA RUN v. W.X.Y.Z: 1.8.0_91
JAVA RUN  full ver.: 1.8.0_91-b14 (may return unknown)
JAVA RUN       type: Java(TM) SE Runtime Environment

Dans le bytecode de classe, il y a vraiment une constante stockée - voir la partie marquée en rouge de Main.call - constante stockée dans le bytecode .class

Constant est dans la classe utilisée pour vérifier si la version JAVA est obsolète (voir Comment Java vérifie qu'il est obsolète)...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top