271 votes

Quelle version de javac a construit mon pot?

Comment puis-je savoir quelle version du compilateur Java a été utilisée pour créer un fichier JAR? J'ai un fichier jar, et il aurait pu être intégré à l'un des trois JDK. Nous devons savoir exactement lequel, afin de pouvoir certifier la compatibilité. La version du compilateur est-elle incorporée quelque part dans les fichiers de classe ou dans le fichier jar?

402voto

unhillbilly Points 4604

Comme Peter Lawrey mentionné en commentaire à la question initiale, vous ne pouvez pas savoir à quel JDK version construit le fichier de classe, mais vous pouvez trouver le code octet version de la classe.

Sur Linux, Mac OS X ou sous Windows avec Cygwin installé, le fichier(1) de commande connaît la version de la classe. Extrait d'une classe à partir d'un pot et utiliser file de l'identifier:

$ jar xf log4j-1.2.15.jar
$ file ./org/apache/log4j/Appender.class
./org/apache/log4j/Appender.class: compiled Java class data, version 45.3

Une autre version de la classe, par exemple:

$ file ~/bin/classes/P.class
/home/dave/bin/classes/P.class: compiled Java class data, version 50.0

La version de la classe de numéro majeur correspond à la Java JDK versions:

  • 45.3 = Java 1.1
  • 46 = Java 1.2
  • 47 = Java 1.3
  • 48 = Java 1.4
  • 49 = Java 5
  • 50 = Java 6
  • 51 = Java 7
  • 52 = Java 8

94voto

Jonathon Faust Points 7543

Vous ne pouvez pas savoir le fichier JAR de lui-même, forcément.

Télécharger un éditeur hexadécimal et ouvrez l'un des fichiers de classe à l'intérieur du BOCAL et de regarder à l'octet décalages de 4 à 7. Les informations de version est construite dans.

http://en.wikipedia.org/wiki/Java_class_file

Remarque: Comme mentionné dans le commentaire ci-dessous,

ces octets de vous dire quelle est la version de la classe a été compilé POUR, pas quelle est la version compilée.

16voto

jackrabbit Points 2990

Le compilateur Java ( javac ) ne construit pas de fichiers JAR, il convertit les fichiers Java en fichiers de classe. L'outil Jar ( jar ) crée des pots. Si aucun manifeste personnalisé n'a été spécifié, le manifeste par défaut spécifiera quelle version du JDK a été utilisée pour créer le fichier JAR.

4voto

JasonPlutext Points 6417

Code posté par Owen à http://www.thatsjava.com/java-essentials/30681/ qui peut vous raconter l'info mentionné par un certain nombre d'autres réponses ici:

public void simpleExample ()
{
FileInputStream fis = new FileInputStream ("mytest.class");
parseJavaClassFile ( fis );
}
protected void parseJavaClassFile ( InputStream classByteStream ) throws Exception
{
DataInputStream dataInputStream = new DataInputStream ( classByteStream );
magicNumber = dataInputStream.readInt();
if ( magicNumber == 0xCAFEBABE )
{
int minorVer = dataInputStream.readUnsignedShort();
int majorVer = dataInputStream.readUnsignedShort();
// do something here with major & minor numbers
}
}

Voir aussi http://mindprod.com/products1.html#JARCHECK et http://clirr.sourceforge.net/

J'ai fini de modifier l'Esprit des Produits code rapidement pour vérifier ce que chacun de mes dépendances a été compilé.

4voto

McDowell Points 62645

Vous pouvez dire à la Java version binaire par l'inspection de la première 8 octets (ou à l'aide d'une application qui peut).

Le compilateur lui-même n'a pas, à ma connaissance, insérer l'identification de la signature. Je ne peux pas en place une telle chose dans le fichier de la VM spec format de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X